github / github/codeql

C path matching issue

Offen
#20,882 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
acknowledged question
Vorherrschende Sprache
CodeQL
Sterne
10.1k
Forks
2.1k
Ø Merge
2 T. 15 Std.
Gemergte PRs (30 T.)
141

Beschreibung

C language code
```
#include
#include
#include
#include

char buf[32];

int main(int argc, char* argv[], char* envp[]){
if(argc<2){
printf("./fd [输入一个参数]\n");
return 0;
}

int fd = atoi( argv[1] ) - 0x1234;
int len = 0;

len = read(fd, buf, 32);

if(!strcmp("LETMEWIN\n", buf)){
printf("恭喜你!挑战成功!\n");
exit(0);
}

printf("程序结束\n");
return 0;
}
```

This is my rule.
```
/**
* @kind path-problem
* @problem.severity warning
* @id getenv-to-gethostbyname
*/
import cpp
import semmle.code.cpp.dataflow.new.DataFlow
import semmle.code.cpp.dataflow.ExternalFlow

module ReadConfig implements DataFlow::ConfigSig{
predicate isSource(DataFlow::Node source) {
exists(Parameter p, ArrayExpr ae |
p.getFunction().getName() = "main" and
ae.getArrayBase() = p.getAnAccess() and
source.asExpr() = ae
)
}

predicate isSink(DataFlow::Node sink) {
exists(FunctionCall fc |
fc.getTarget().getName() = "read" and
sink.asExpr() = fc.getArgument(0)
)
}

}

module ReadConfigFlow = DataFlow::Global;
import ReadConfigFlow::PathGraph

from ReadConfigFlow::PathNode source, ReadConfigFlow::PathNode sink
where ReadConfigFlow::flowPath(source, sink)
select sink.getNode(), source, sink, "read",
source, "input"
```

The source can match argv[1].

Image

The sink can also match the file descriptor (fd) of the read function.

Image

However, the rule as a whole fails to match the path.

Please help me.

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginnen Sie mit dem bereitgestellten C-Beispiel und der DataFlow-Konfiguration ReadConfig und vergleichen Sie die Quelle argv[1] mit dem File-Descriptor-Argument des read-Aufrufs. Verfolgen Sie, wie die fd-Zuweisung und das read-Argument im PathGraph dargestellt werden, und ermitteln Sie anschließend, warum die einzelnen Matches keinen vollständigen Pfad ergeben. Als erledigt gilt die Aufgabe, wenn die Ursache dokumentiert oder reproduziert und das erwartete Matching-Verhalten identifiziert wurde.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
c
Bereich
security
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.