Skip to content

Commit 252c9e9

Browse files
committed
Added data extension to set defaults, updated help, added README to explain customization
1 parent 3a98edb commit 252c9e9

File tree

4 files changed

+54
-27
lines changed

4 files changed

+54
-27
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/javascript-queries
4+
extensible: requiredHelmetSecuritySetting
5+
data:
6+
- ["frameguard"]
7+
- ["contentSecurityPolicy"]

javascript/ql/src/Security/CWE-693/InsecureHelmet.qhelp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,12 @@
2222
Users of the query can extend the set of required Helmet features by adding additional checks for them, using CodeQL <a href="https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/">data extensions</a>.
2323
</p>
2424

25-
<pre>
26-
extensions:
27-
- addsTo:
28-
pack: codeql/javascript-all
29-
extensible: requiredHelmetSecuritySetting
25+
<pre>extensions:
26+
- addsTo:
27+
pack: codeql/javascript-all
28+
extensible: requiredHelmetSecuritySetting
3029
data:
31-
- name: "frameguard"
32-
</pre>
30+
- ["frameguard"]</pre>
3331

3432
<p>
3533
Note: <code>frameguard</code> is an example: the query already enforces this setting, so it is not necessary to add it to the data extension.

javascript/ql/src/Security/CWE-693/InsecureHelmet.ql

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
* cwe-1021
1212
*/
1313

14+
import javascript
15+
import DataFlow
1416
import semmle.javascript.frameworks.ExpressModules
1517

1618
class HelmetProperty extends DataFlow::Node instanceof DataFlow::PropWrite {
@@ -22,39 +24,23 @@ class HelmetProperty extends DataFlow::Node instanceof DataFlow::PropWrite {
2224

2325
ExpressLibraries::HelmetRouteHandler getHelmet() { result = helmet }
2426

25-
predicate isFalse() { DataFlow::PropWrite.super.getRhs().mayHaveBooleanValue(true) }
27+
predicate isFalse() { DataFlow::PropWrite.super.getRhs().mayHaveBooleanValue(false) }
2628

2729
string getName() { result = DataFlow::PropWrite.super.getPropertyName() }
2830

2931
predicate isImportantSecuritySetting() {
30-
this.getName() in ["frameguard", "contentSecurityPolicy"]
31-
or
32-
// read from data extensions to allow enforcing other settings
32+
// read from data extensions to allow enforcing custom settings
33+
// defaults are located in javascript/ql/lib/semmle/frameworks/helmet/Helmet.Required.Setting.model.yml
3334
requiredHelmetSecuritySetting(this.getName())
3435
}
3536
}
3637

37-
/*
38-
* Extend the required Helmet security settings using data extensions.
39-
* Docs: https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/
40-
* For example:
41-
*
42-
* extensions:
43-
* - addsTo:
44-
* pack: codeql/javascript-all
45-
* extensible: requiredHelmetSecuritySetting
46-
* data:
47-
* - name: "frameguard"
48-
*
49-
* Note: `frameguard` is an example: the query already enforces this setting, so it is not necessary to add it to the data extension.
50-
*/
51-
5238
extensible predicate requiredHelmetSecuritySetting(string name);
5339

5440
from HelmetProperty helmetProperty, ExpressLibraries::HelmetRouteHandler helmet
5541
where
5642
helmetProperty.isFalse() and
5743
helmetProperty.isImportantSecuritySetting() and
5844
helmetProperty.getHelmet() = helmet
59-
select helmet, "Helmet route handler, called with $@ set to 'false'.", helmetProperty,
45+
select helmet, "Helmet security middleware, configured with security setting $@ set to 'false', which disables enforcing that feature.", helmetProperty,
6046
helmetProperty.getName()
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Insecure Helmet Configuration - customizations
2+
3+
You can extend the required [Helmet security settings](https://helmetjs.github.io/) using [data extensions](https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/).
4+
5+
They are defaulted to just `frameguard` and `contentSecurityPolicy`, but you can add more using this method, to require them not to be set to `false` (which explicitly disables them) in the Helmet configuration.
6+
7+
For example, this YAML model can be used inside a CodeQL model pack to require `frameguard` and `contentSecurityPolicy`:
8+
9+
```yaml
10+
extensions:
11+
- addsTo:
12+
pack: codeql/javascript-all
13+
extensible: requiredHelmetSecuritySetting
14+
data:
15+
- ["frameguard"]
16+
- ["contentSecurityPolicy"]
17+
```
18+
19+
Note: Using `frameguard` and `contentSecurityPolicy` is an example: the query already enforces these, so it is not necessary to add it with your own data extension.
20+
21+
A suitable model pack might be:
22+
23+
```yaml
24+
name: my-org/javascript-helmet-insecure-config-model-pack
25+
version: 1.0.0
26+
extensionTargets:
27+
codeql/java-all: '*'
28+
dataExtensions:
29+
- models/**/*.yml
30+
```
31+
32+
## References
33+
34+
- [Helmet security settings](https://helmetjs.github.io/)
35+
- [Customizing library models for javascript](https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-javascript/)
36+
- [Creating and working with CodeQL packs](https://docs.github.com/en/code-security/codeql-cli/using-the-advanced-functionality-of-the-codeql-cli/creating-and-working-with-codeql-packs#creating-a-codeql-model-pack)

0 commit comments

Comments
 (0)