Skip to content

Taint Tracking to a LocalVariable #16438

Open
@mies47

Description

@mies47

Hello,

I'm trying my query on a simple code before moving to my main codebase. Basically, I would like to track all the local taints from all the function arguments to the LocalVariables in that function. This is the simplest version but eventually I want to find all such taints that are coming from an assignment in a loop.

Here's my simple C code:

#include <stdlib.h>
#include <stdio.h>

void call1(char* in) {
        char buff[10];
        char a;
        a = in[3];
        for (int i = 0; i < 10; i++) {
                buff[i] = in[i];
        }
        printf("%s\n", buff);
}

int main() {
        char *input = "Hello!!!!";
        call1(input);
        return 0;
}

Here's my simple CodeQL query:

from DataFlow::Node source, DataFlow::Node sink, LocalVariable lv, Function f
where
        f.getAParameter() = source.asParameter() and
        lv.getAnAccess() = sink.asExpr() and
        lv.getFunction() = f and
        TaintTracking::localTaint(source, sink)
select source, sink

I want to find the following taints:
in -> buff, in -> a

For now the query returns nothing. But if I comment the TaintTracking::localTaint(source, sink) line it would return the following:

Result set: edges
| a | b |
+---+---+

Result set: nodes
| n | key | val |
+---+-----+-----+

Result set: subpaths
| arg | par | ret | out |
+-----+-----+-----+-----+

Result set: #select
| source | sink |
+--------+------+
| in     | a    |
| in     | i    |
| in     | i    |
| in     | buff |
| in     | i    |
| in     | i    |
| in     | buff |

I'm not really sure why this happens and if I should probably define an additional taint step. I'd appreciate any help.

Metadata

Metadata

Assignees

Labels

C++questionFurther information is requested

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions