1111import powershell
1212
1313predicate containsScope ( VarAccess outer , VarAccess inner ) {
14- outer .getUserPath ( ) = inner .getUserPath ( ) and
14+ outer .getVariable ( ) . getName ( ) = inner .getVariable ( ) . getName ( ) and
1515 outer != inner
1616}
1717
@@ -23,16 +23,16 @@ predicate constantBinaryExpression(BinaryExpr binary) {
2323 onlyConstantExpressions ( binary .getLeft ( ) ) and onlyConstantExpressions ( binary .getRight ( ) )
2424}
2525
26- predicate onlyConstantExpressions ( Expr expr ) {
27- expr instanceof StringConstExpr or constantBinaryExpression ( expr ) or constantTernaryExpression ( expr )
26+ predicate onlyConstantExpressions ( Expr expr ) {
27+ expr instanceof StringConstExpr or
28+ constantBinaryExpression ( expr ) or
29+ constantTernaryExpression ( expr )
2830}
2931
3032VarAccess getNonConstantVariableAssignment ( VarAccess varexpr ) {
31- (
32- exists ( AssignStmt assignment |
33- not onlyConstantExpressions ( assignment .getRightHandSide ( ) .( CmdExpr ) .getExpr ( ) ) and
34- result = assignment .getLeftHandSide ( )
35- )
33+ exists ( AssignStmt assignment |
34+ not onlyConstantExpressions ( assignment .getRightHandSide ( ) ) and
35+ result = assignment .getLeftHandSide ( )
3636 ) and
3737 containsScope ( result , varexpr )
3838}
@@ -44,31 +44,35 @@ VarAccess getParameterWithVariableScope(VarAccess varexpr) {
4444 )
4545}
4646
47- Expr getAllSubExpressions ( Expr expr )
48- {
47+ Expr getAllSubExpressions ( Expr expr ) {
4948 result = expr or
50- result = getAllSubExpressions ( expr .( ArrayLiteral ) .getAnElement ( ) ) or
51- result = getAllSubExpressions ( expr .( ArrayExpr ) .getStmtBlock ( ) .getAStmt ( ) .( Pipeline ) .getAComponent ( ) .( CmdExpr ) .getExpr ( ) )
49+ result = getAllSubExpressions ( expr .( ArrayLiteral ) .getAnExpr ( ) ) or
50+ result =
51+ getAllSubExpressions ( expr .( ArrayExpr )
52+ .getStmtBlock ( )
53+ .getAStmt ( )
54+ .( ExprStmt )
55+ .getExpr ( )
56+ .( Pipeline )
57+ .getAComponent ( ) )
5258}
5359
54- Expr dangerousCommandElement ( Cmd command )
55- {
60+ Expr dangerousCommandElement ( CallExpr command ) {
5661 (
57- command . getKind ( ) = 28 or
58- command .getCommandName ( ) = "Invoke-Expression"
62+ command instanceof CallOperator or
63+ command .getName ( ) = "Invoke-Expression"
5964 ) and
6065 result = getAllSubExpressions ( command .getAnArgument ( ) )
6166}
6267
6368from Expr commandarg , VarAccess unknownDeclaration
6469where
65- exists ( Cmd command |
70+ exists ( CallExpr command |
6671 (
6772 unknownDeclaration = getNonConstantVariableAssignment ( commandarg ) or
6873 unknownDeclaration = getParameterWithVariableScope ( commandarg )
69- )
70- and
74+ ) and
7175 commandarg = dangerousCommandElement ( command )
7276 )
7377select commandarg .( VarAccess ) .getLocation ( ) , "Unsafe flow to command argument from $@." ,
74- unknownDeclaration , unknownDeclaration .getUserPath ( )
78+ unknownDeclaration , unknownDeclaration .getVariable ( ) . getName ( )
0 commit comments