Skip to content

Commit f9c3bde

Browse files
committed
PS: Fix false positive by adding a type-based sanitizer.
1 parent e795630 commit f9c3bde

File tree

3 files changed

+25
-8
lines changed

3 files changed

+25
-8
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
private import powershell
2+
private import semmle.code.powershell.dataflow.DataFlow
3+
4+
/**
5+
* A dataflow node that is guarenteed to have a "simple" type.
6+
*
7+
* Simple types include integers, floats, characters, booleans, and `datetime`.
8+
*/
9+
class SimpleTypeSanitizer extends DataFlow::Node {
10+
SimpleTypeSanitizer() {
11+
this.asParameter().getStaticType() =
12+
["int32", "int64", "single", "double", "decimal", "char", "boolean", "datetime"]
13+
}
14+
}

powershell/ql/lib/semmle/code/powershell/security/SqlInjectionCustomizations.qll

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ private import semmle.code.powershell.dataflow.DataFlow
88
import semmle.code.powershell.ApiGraphs
99
private import semmle.code.powershell.dataflow.flowsources.FlowSources
1010
private import semmle.code.powershell.Cfg
11+
private import semmle.code.powershell.security.Sanitizers
1112

1213
module SqlInjection {
1314
/**
@@ -99,4 +100,6 @@ module SqlInjection {
99100

100101
override string getSinkType() { result = "call to sqlcmd" }
101102
}
103+
104+
class TypeSanitizer extends Sanitizer instanceof SimpleTypeSanitizer { }
102105
}

powershell/ql/test/query-tests/security/cwe-089/test.ps1

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,28 +82,28 @@ Invoke-Sqlcmd @QueryConn2 # BAD
8282

8383
function TakesTypedParameters([int]$i, [long]$l, [float]$f, [double]$d, [decimal]$dec, [char]$c, [bool]$b, [datetime]$dt) {
8484
$query1 = "SELECT * FROM MyTable WHERE MyColumn = '$i'"
85-
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query1 # GOOD [FALSE POSITIVE]
85+
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query1 # GOOD
8686

8787
$query2 = "SELECT * FROM MyTable WHERE MyColumn = '$l'"
88-
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query2 # GOOD [FALSE POSITIVE]
88+
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query2 # GOOD
8989

9090
$query3 = "SELECT * FROM MyTable WHERE MyColumn = '$f'"
91-
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query3 # GOOD [FALSE POSITIVE]
91+
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query3 # GOOD
9292

9393
$query4 = "SELECT * FROM MyTable WHERE MyColumn = '$d'"
94-
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query4 # GOOD [FALSE POSITIVE]
94+
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query4 # GOOD
9595

9696
$query5 = "SELECT * FROM MyTable WHERE MyColumn = '$dec'"
97-
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query5 # GOOD [FALSE POSITIVE]
97+
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query5 # GOOD
9898

9999
$query6 = "SELECT * FROM MyTable WHERE MyColumn = '$c'"
100-
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query6 # GOOD [FALSE POSITIVE]
100+
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query6 # GOOD
101101

102102
$query7 = "SELECT * FROM MyTable WHERE MyColumn = '$b'"
103-
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query7 # GOOD [FALSE POSITIVE]
103+
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query7 # GOOD
104104

105105
$query8 = "SELECT * FROM MyTable WHERE MyColumn = '$dt'"
106-
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query8 # GOOD [FALSE POSITIVE]
106+
Invoke-Sqlcmd -ServerInstance "MyServer" -Database "MyDatabase" -Query $query8 # GOOD
107107
}
108108

109109
TakesTypedParameters $userinput $userinput $userinput $userinput $userinput $userinput $userinput $userinput

0 commit comments

Comments
 (0)