我正在尝试为编写用于创建二进制文件的C ++代码进行强化静态分析。但是,这个版本需要花费数小时 - 有时超过一天 - 才能完成。
为了解决这个问题,我试图通过创建一个伪存档作为目标,单独构建所有.o文件。我在这种方法中看到的优势是代码不归我们团队所有,无需构建,也节省了链接时间。当我这样做时,我们看到了构建时间方面的巨大收益。
然而,我团队中的一个人认为这可能导致误报和漏报,因为它错过了与我们所有权之外的代码的交互。他给出的一个例子是,对我们所有权之外的库的API调用之间的共享对象。换句话说,我们将无法知道您域外对象的操作。但是当所有文件所有者为他们的代码做同样的事情时,这不会被处理吗?
请告知我的方法是否正确。
答案 0 :(得分:1)
您的方法可能会导致误报,但更可能是假阴性,更糟糕的是,和/或风险评级过低。
数据流分析器使用全局的,程序间的污点传播分析来检测源(用户输入)和接收器之间的数据流(危险函数调用) )。
如果数据流分析器找不到接收器,那么分析器将停止跟随此污点传播并转移到另一个,错过漏洞(假阴性)。
以下伪代码是 PII曝光和 SQL注入的示例:
public static void main(String args[]) throws Exception {
ResultSet results = SQLInj(args);
System.out.println(results.Password);
}
public static ResultSet SQLInj(String args[]) {
String query = "SELECT * FROM user_data WHERE last_name = '" + args[1] + "'";
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery(query);
}
来源是 main-> args [] ,接收器是 SQLInj-> executeQuery()。
如果函数 SQLInj 驻留在未扫描的代码中(不是您团队的代码),则无法找到SQL注入问题,因为数据流分析器从未找到接收器。语义分析器可以通过查找单词“password”找到PII暴露,但信心等级要低得多。