Skip to content

C path matching issue #20882

@foxbyte9

Description

@foxbyte9

C language code

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

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<ReadConfig>;
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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    acknowledgedGitHub staff acknowledges this issuequestionFurther information is requested

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions