Skip to content

Commit eb8fb26

Browse files
authored
Merge pull request #5 from GitHubSecurityLab/crypto-tls-disabled
feat(query): Add TLS Disabled query
2 parents caf23c9 + 1c12963 commit eb8fb26

File tree

7 files changed

+110
-0
lines changed

7 files changed

+110
-0
lines changed

ql/lib/codeql/bicep/Concepts.qll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ abstract class PublicResource extends Resource {
1212
}
1313

1414
module Cryptography {
15+
abstract class TlsDisabled extends Resource {
16+
abstract boolean isTlsDisabled();
17+
}
18+
1519
abstract class WeakTlsVersion extends Resource {
1620
abstract StringLiteral getWeakTlsVersionProperty();
1721

ql/lib/codeql/bicep/frameworks/Microsoft/Cache.qll

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,18 @@ module Cache {
7676
}
7777
}
7878

79+
class RedisCacheTlsDisabled extends RedisCacheResource, Cryptography::TlsDisabled {
80+
override boolean isTlsDisabled() {
81+
exists(boolean tlsPortDisabled | tlsPortDisabled = this.enableNonSslPort() |
82+
tlsPortDisabled = true and
83+
result = false
84+
or
85+
tlsPortDisabled = false and
86+
result = true
87+
)
88+
}
89+
}
90+
7991
module CacheProperties {
8092
/**
8193
* Represents the properties object for a Redis cache resource.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# TLS Disabled
2+
3+
Disabling TLS (Transport Layer Security) exposes resources to unencrypted network traffic, making them vulnerable to interception and attacks. Always ensure TLS is enabled for all network-accessible resources.
4+
5+
## Bad Example
6+
The following Bicep resource has `enableNonSslPort` set to `true`, which disables TLS and allows unencrypted connections:
7+
8+
```bicep
9+
resource redis 'Microsoft.Cache/Redis@2021-06-01' = {
10+
name: 'myredis'
11+
location: 'eastus'
12+
properties: {
13+
enableNonSslPort: true
14+
publicNetworkAccess: 'Enabled'
15+
}
16+
}
17+
```
18+
19+
## Good Example
20+
The following Bicep resources either do not set `enableNonSslPort` (defaulting to secure) or explicitly set it to `false`, ensuring TLS is enforced:
21+
22+
```bicep
23+
// TLS enforced by default (property not set)
24+
resource redis1 'Microsoft.Cache/Redis@2021-06-01' = {
25+
name: 'redis1'
26+
location: 'eastus'
27+
properties: {
28+
publicNetworkAccess: 'Enabled'
29+
}
30+
}
31+
32+
// TLS explicitly enforced
33+
resource redis2 'Microsoft.Cache/Redis@2021-06-01' = {
34+
name: 'redis2'
35+
location: 'eastus'
36+
properties: {
37+
enableNonSslPort: false
38+
publicNetworkAccess: 'Enabled'
39+
}
40+
}
41+
```
42+
43+
## Recommendation
44+
Always leave `enableNonSslPort` unset or set it to `false` to ensure all connections are encrypted using TLS.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* @name TLS Disabled
3+
* @description Detects resources where TLS is disabled, which is insecure.
4+
* @kind problem
5+
* @problem.severity error
6+
* @security-severity 8.5
7+
* @precision high
8+
* @id bicep/tls-disabled
9+
* @tags security
10+
* bicep
11+
* azure
12+
* cryptography
13+
*/
14+
import bicep
15+
16+
from Cryptography::TlsDisabled resource
17+
where resource.isTlsDisabled() = true
18+
select resource, "TLS is disabled for this resource"
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
| app.bicep:12:1:19:1 | RedisCacheResource | TLS is disabled for this resource |
2+
| app.bicep:22:1:29:1 | RedisCacheResource | TLS is disabled for this resource |
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
security/CWE-327/TlsDisabled.ql
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Bicep sample with TLS disabled for testing
2+
// Case 1: enableNonSslPort not set (should be secure)
3+
resource redis1 'Microsoft.Cache/Redis@2021-06-01' = {
4+
name: 'redis1'
5+
location: 'eastus'
6+
properties: {
7+
publicNetworkAccess: 'Enabled'
8+
}
9+
}
10+
11+
// Case 2: enableNonSslPort enabled (TLS disabled, should trigger)
12+
resource redis2 'Microsoft.Cache/Redis@2021-06-01' = {
13+
name: 'redis2'
14+
location: 'eastus'
15+
properties: {
16+
enableNonSslPort: true
17+
publicNetworkAccess: 'Enabled'
18+
}
19+
}
20+
21+
// Case 3: enableNonSslPort disabled (TLS enforced, should be secure)
22+
resource redis3 'Microsoft.Cache/Redis@2021-06-01' = {
23+
name: 'redis3'
24+
location: 'eastus'
25+
properties: {
26+
enableNonSslPort: false
27+
publicNetworkAccess: 'Enabled'
28+
}
29+
}

0 commit comments

Comments
 (0)