@@ -9,17 +9,17 @@ import codeql.actions.dataflow.FlowSources
99
1010abstract class EnvVarInjectionSink extends DataFlow:: Node { }
1111
12+ string sanitizerCommand ( ) {
13+ result =
14+ [
15+ "tr\\s+(-d\\s*)?('|\")?.n('|\")?" , // tr -d '\n' ' ', tr '\n' ' '
16+ "tr\\s+-cd\\s+.*:alpha:" , // tr -cd '[:alpha:_]'
17+ "(head|tail)\\s+-n\\s+1" // head -n 1, tail -n 1
18+ ]
19+ }
20+
1221/**
1322 * Holds if a Run step declares an environment variable with contents from a local file.
14- * e.g.
15- * run: |
16- * cat test-results/.env >> $GITHUB_ENV
17- *
18- * echo "sha=$(cat test-results/sha-number)" >> $GITHUB_ENV
19- * echo "sha=$(<test-results/sha-number)" >> $GITHUB_ENV
20- *
21- * FOO=$(cat test-results/sha-number)
22- * echo "FOO=$FOO" >> $GITHUB_ENV
2323 */
2424class EnvVarInjectionFromFileReadSink extends EnvVarInjectionSink {
2525 EnvVarInjectionFromFileReadSink ( ) {
@@ -31,11 +31,19 @@ class EnvVarInjectionFromFileReadSink extends EnvVarInjectionSink {
3131 this .asExpr ( ) = run .getScript ( ) and
3232 step .getAFollowingStep ( ) = run and
3333 (
34- exists ( string cmd |
35- run .getScript ( ) .getACmdReachingGitHubEnvWrite ( cmd , _) and
36- run .getScript ( ) .getAFileReadCommand ( ) = cmd
34+ // eg:
35+ // echo "SHA=$(cat test-results/sha-number)" >> $GITHUB_ENV
36+ // echo "SHA=$(<test-results/sha-number)" >> $GITHUB_ENV
37+ // FOO=$(cat test-results/sha-number)
38+ // echo "FOO=$FOO" >> $GITHUB_ENV
39+ exists ( string cmd , string var , string sanitizer |
40+ run .getScript ( ) .getAFileReadCommand ( ) = cmd and
41+ run .getScript ( ) .getACmdReachingGitHubEnvWrite ( cmd , var ) and
42+ run .getScript ( ) .getACmdReachingGitHubEnvWrite ( sanitizer , var ) and
43+ not exists ( sanitizer .regexpFind ( sanitizerCommand ( ) , _, _) )
3744 )
3845 or
46+ // eg: cat test-results/.env >> $GITHUB_ENV
3947 run .getScript ( ) .fileToGitHubEnv ( _)
4048 )
4149 )
@@ -51,9 +59,18 @@ class EnvVarInjectionFromFileReadSink extends EnvVarInjectionSink {
5159 */
5260class EnvVarInjectionFromCommandSink extends EnvVarInjectionSink {
5361 EnvVarInjectionFromCommandSink ( ) {
54- exists ( CommandSource source |
62+ exists ( CommandSource source , Run run , string var |
5563 this .asExpr ( ) = source .getEnclosingRun ( ) .getScript ( ) and
56- source .getEnclosingRun ( ) .getScript ( ) .getACmdReachingGitHubEnvWrite ( source .getCommand ( ) , _)
64+ run = source .getEnclosingRun ( ) and
65+ run .getScript ( ) .getACmdReachingGitHubEnvWrite ( source .getCommand ( ) , var ) and
66+ (
67+ not run .getScript ( ) .getACmdReachingGitHubEnvWrite ( _, var )
68+ or
69+ exists ( string sanitizer |
70+ run .getScript ( ) .getACmdReachingGitHubEnvWrite ( sanitizer , var ) and
71+ not exists ( sanitizer .regexpFind ( sanitizerCommand ( ) , _, _) )
72+ )
73+ )
5774 )
5875 }
5976}
@@ -68,10 +85,18 @@ class EnvVarInjectionFromCommandSink extends EnvVarInjectionSink {
6885 */
6986class EnvVarInjectionFromEnvVarSink extends EnvVarInjectionSink {
7087 EnvVarInjectionFromEnvVarSink ( ) {
71- exists ( Run run , string var_name |
88+ exists ( Run run , string var_name , string var |
7289 exists ( run .getInScopeEnvVarExpr ( var_name ) ) and
7390 run .getScript ( ) = this .asExpr ( ) and
74- run .getScript ( ) .getAnEnvReachingGitHubEnvWrite ( var_name , _)
91+ run .getScript ( ) .getAnEnvReachingGitHubEnvWrite ( var_name , var ) and
92+ (
93+ not run .getScript ( ) .getACmdReachingGitHubEnvWrite ( _, var )
94+ or
95+ exists ( string sanitizer |
96+ run .getScript ( ) .getACmdReachingGitHubEnvWrite ( sanitizer , var ) and
97+ not exists ( sanitizer .regexpFind ( sanitizerCommand ( ) , _, _) )
98+ )
99+ )
75100 )
76101 }
77102}
0 commit comments