Skip to content

Commit 2aaf41a

Browse files
committed
C++: Test lack of flow through read side effect
1 parent 84811f6 commit 2aaf41a

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

cpp/ql/src/semmle/code/cpp/models/implementations/Inet.qll

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class InetAton extends TaintFunction, ArrayFunction {
3030
}
3131
}
3232

33-
class InetAddr extends TaintFunction, ArrayFunction {
33+
class InetAddr extends TaintFunction, ArrayFunction, AliasFunction {
3434
InetAddr() { hasGlobalName("inet_addr") }
3535

3636
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
@@ -41,6 +41,12 @@ class InetAddr extends TaintFunction, ArrayFunction {
4141
override predicate hasArrayInput(int bufParam) { bufParam = 0 }
4242

4343
override predicate hasArrayWithNullTerminator(int bufParam) { bufParam = 0 }
44+
45+
override predicate parameterNeverEscapes(int index) { index = 0 }
46+
47+
override predicate parameterEscapesOnlyViaReturn(int index) { none() }
48+
49+
override predicate parameterIsAlwaysReturned(int index) { none() }
4450
}
4551

4652
class InetNetwork extends TaintFunction, ArrayFunction {

cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/defaulttainttracking.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,16 @@ int main(int argc, char *argv[]) {
2626

2727
return 0;
2828
}
29+
30+
typedef unsigned int inet_addr_retval;
31+
inet_addr_retval inet_addr(const char *dotted_address);
32+
void sink(inet_addr_retval);
33+
34+
void test_indirect_arg_to_model() {
35+
// This test is non-sensical but carefully arranged so we get data flow into
36+
// inet_addr not through the function argument but through its associated
37+
// read side effect.
38+
void *env_pointer = getenv("VAR"); // env_pointer is tainted, not its data.
39+
inet_addr_retval a = inet_addr((const char *)&env_pointer);
40+
sink(a);
41+
}

cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,7 @@
2525
| defaulttainttracking.cpp:22:20:22:25 | call to getenv | defaulttainttracking.cpp:22:8:22:33 | (const char *)... |
2626
| defaulttainttracking.cpp:22:20:22:25 | call to getenv | defaulttainttracking.cpp:22:20:22:25 | call to getenv |
2727
| defaulttainttracking.cpp:22:20:22:25 | call to getenv | defaulttainttracking.cpp:22:20:22:32 | (const char *)... |
28+
| defaulttainttracking.cpp:38:25:38:30 | call to getenv | defaulttainttracking.cpp:38:11:38:21 | env_pointer |
29+
| defaulttainttracking.cpp:38:25:38:30 | call to getenv | defaulttainttracking.cpp:38:25:38:30 | call to getenv |
30+
| defaulttainttracking.cpp:38:25:38:30 | call to getenv | defaulttainttracking.cpp:38:25:38:37 | (void *)... |
31+
| defaulttainttracking.cpp:38:25:38:30 | call to getenv | defaulttainttracking.cpp:39:50:39:61 | & ... |

0 commit comments

Comments
 (0)