获得源码
编辑 /etc/apt/sources.list
,需要有一个 deb-src
项作为源码仓库。然后执行 apt update && apt source netcat
就可以获得对应软件的源码。
代码审计工具(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 进行代码分析
内置分析器
- 创建解决方案
- 将源码加入解决方案
- 点击“分析” > “运行代码分析” > “针对解决方案”
分析函数
对可能存在(溢出、UAF、DoubleFree 等)问题的函数上右键,“查看调用层次结构”,分析传入参数是否用户可控。
基本思想
- 寻找潜在的漏洞发生地点
- 如何到达存在漏洞的函数(用户可控)
- 是否可以利用(危害程度)
常见漏洞
格式化字符串漏洞
- 如果格式化串是一个指针,而非字符串字面量,则可能存在漏洞。如
printf(argv[1])
。
溢出漏洞
- 如果存在
memcpy
、strcpy
、手写循环等代码,仔细分析是否可能存在溢出。 - 使用
memcpy
时,使用src
的长度进行复制,如果这个长度超过dst
的长度就会溢出。 - 使用
strncpy
时,如果n>src
的长度,最多复制src
的长度个字符,不足n
的长度填充\0
直到一共n
个字节。如果n<=src
的长度,只是将src
的前n
个字符复制到dst
的前n
个字符,不自动添加'\0'
,需要再手动添加一个'\0'
。src
和dest
所指内存区域不可以重叠。
垂悬指针(UAF、DoubleFree)
- 观察箭头调用
->
时,对象是否可能已被释放。 - 观察
delete
、free
时,对象是否可能已被释放。 - 观察已释放的对象是否可能被重复使用,如果指针没有置空则可能存在漏洞。
算术运算
- 有符号数的运算中掺有了无符号数,便会发生变量类型的传播,即隐形转换以后,整个比较都会以无符号数的方式来进行。
- 进行(有符号和无符号数的)算术运算时,可能存在整数溢出。
- 浮点数的不精确性是否可能造成漏洞。
类型混淆
- 当存在可转换类型时,是否可能因为类型错用导致问题
错误理解 API 的参数和返回值
- 如果程序员没有仔细看API手册,错误理解参数或返回值的含义时,可能造成问题。如
sprintf
的返回值为实际写入的字符串长度,但snprintf
的返回值为本应写入的长度(实际上这个长度被 n 限制了),而非实际写入的长度。
错误地使用宏
- 待补充
危险函数
system()
getenv()
fopen()
参考
……