代码审计入门

代码审计工具(Static Code Analysis Tool)

Flawfinder 开源的 C 语言审计工具

pip install flawfinder
.local/bin/flawfinder --html path_to_source/code.c > desktop/out.html
  • splint 开源的 C 语言审计工具
  • RIPS:付费的 PHP 审计工具
  • FindBugs:开源的 Java 审计工具
  • RATS(Rough Auditing Tool for Security):Google 的开源代码审计工具,支持多种语言
  • AppScan Source:IBM 推出的移动应用代码审计工具(付费)
  • Fortify:付费审计工具,支持多种语言

使用 Visual Studio 进行代码分析

内置分析器

  1. 创建解决方案
  2. 将源码加入解决方案
  3. 点击“分析” > “运行代码分析” > “针对解决方案”

分析函数

对可能存在(溢出、UAF、DoubleFree 等)问题的函数上右键,“查看调用层次结构”,分析传入参数是否用户可控。

基本思想

  1. 寻找潜在的漏洞发生地点
  2. 如何到达存在漏洞的函数(用户可控)
  3. 是否可以利用(危害程度)

常见漏洞

格式化字符串漏洞

  • 如果格式化串是一个指针,而非字符串字面量,则可能存在漏洞。如 printf(argv[1])

溢出漏洞

  • 如果存在 memcpystrcpy、手写循环等代码,仔细分析是否可能存在溢出。
  • 使用 memcpy 时,使用 src 的长度进行复制,如果这个长度超过 dst 的长度就会溢出。
  • 使用 strncpy 时,如果 n>src 的长度,最多复制 src 的长度个字符,不足 n 的长度填充 \0 直到一共 n 个字节。如果 n<=src 的长度,只是将 src 的前 n 个字符复制到 dst 的前 n 个字符,不自动添加 '\0',需要再手动添加一个 '\0'srcdest 所指内存区域不可以重叠。

垂悬指针(UAF、DoubleFree)

  • 观察箭头调用 -> 时,对象是否可能已被释放。
  • 观察 deletefree 时,对象是否可能已被释放。
  • 观察已释放的对象是否可能被重复使用,如果指针没有置空则可能存在漏洞。

算术运算

  • 有符号数的运算中掺有了无符号数,便会发生变量类型的传播,即隐形转换以后,整个比较都会以无符号数的方式来进行。
  • 进行(有符号和无符号数的)算术运算时,可能存在整数溢出。
  • 浮点数的不精确性是否可能造成漏洞。

类型混淆

  • 当存在可转换类型时,是否可能因为类型错用导致问题

错误理解 API 的参数和返回值

  • 如果程序员没有仔细看API手册,错误理解参数或返回值的含义时,可能造成问题。如 snprintf 的返回值

错误地使用宏

  • 待补充

参考

……

你可能感兴趣的:(Linux)