1
1
import powershell
2
+ private import semmle.code.powershell.dataflow.internal.DataFlowImplCommon
3
+ private import semmle.code.powershell.dataflow.internal.DataFlowDispatch
4
+ private import semmle.code.powershell.controlflow.CfgNodes
2
5
3
6
abstract private class AbstractCall extends Ast {
4
7
abstract Expr getCommand ( ) ;
@@ -17,6 +20,9 @@ abstract private class AbstractCall extends Ast {
17
20
18
21
/** Gets the qualifier of this call, if any. */
19
22
Expr getQualifier ( ) { none ( ) }
23
+
24
+ /** Gets a possible runtime target of this call. */
25
+ abstract Function getATarget ( ) ;
20
26
}
21
27
22
28
private class CmdCall extends AbstractCall instanceof Cmd {
@@ -27,6 +33,14 @@ private class CmdCall extends AbstractCall instanceof Cmd {
27
33
final override Expr getArgument ( int i ) { result = Cmd .super .getArgument ( i ) }
28
34
29
35
final override Expr getNamedArgument ( string name ) { result = Cmd .super .getNamedArgument ( name ) }
36
+
37
+ final override Function getATarget ( ) {
38
+ exists ( DataFlowCall call | call .asCall ( ) .( StmtNodes:: CmdCfgNode ) .getStmt ( ) = this |
39
+ result .getBody ( ) = viableCallableLambda ( call , _) .asCfgScope ( )
40
+ or
41
+ result .getBody ( ) = getTarget ( call )
42
+ )
43
+ }
30
44
}
31
45
32
46
private class InvokeMemberCall extends AbstractCall instanceof InvokeMemberExpr {
@@ -41,6 +55,14 @@ private class InvokeMemberCall extends AbstractCall instanceof InvokeMemberExpr
41
55
final override Expr getQualifier ( ) { result = InvokeMemberExpr .super .getQualifier ( ) }
42
56
43
57
final override Expr getNamedArgument ( string name ) { none ( ) }
58
+
59
+ final override Function getATarget ( ) {
60
+ exists ( DataFlowCall call | call .asCall ( ) .( ExprNodes:: InvokeMemberCfgNode ) .getExpr ( ) = this |
61
+ result .getBody ( ) = viableCallableLambda ( call , _) .asCfgScope ( )
62
+ or
63
+ result .getBody ( ) = getTarget ( call )
64
+ )
65
+ }
44
66
}
45
67
46
68
final class Call = AbstractCall ;
0 commit comments