源代码安全检测工具PC_Lint与ITS4实例 zz
1. 目前代码的安全形势2 `4 S# {, ~% U4 a 1.1 缓冲区溢出问题( t) b6 W7 V) n: S- C “缓冲区溢出”是越过了数组边界进行读写的一类内存访问错误。大家知道,在标准C 语言库中提供了许多关于字符串的操作的函数,如:gets() 、strcpy () 、strcat ( ) 、strcmp ( ) 、sprintf ( ) 等。它们在本质上是不安全的,存在安全隐患,例如gets (str) 指令,在编译这条指令时,str 以字符数组的身份分配内存空间,并且str是所分配内存的一个连续存储区的首地址。gets 读取标准输入的文本,把第一个字符存入str 首地址内存单元中,后续字符依次存储,直到标准输入遇到结束符“ / 0”并存放到最后一个字节的存储单元中。在执行这条指令时,由于程序员不能预先确定缓冲区的大小,若读入的文本长度超出编译给定的存储区长度,则读入的字符会覆盖str 所代表的存储区的后续空间,因此,出现了所谓的缓冲区溢出。下面是一段存在缓冲区溢出问题的代码:4 i. u# m: O* y #include using namespace std; " J; G4 X* N4 T/ W( U- m int main() { 5 C M' p0 q s0 b, /- s5 } char pwd[10]; 6 V' _0 ?7 _7 f: Z# Y0 i' r, j cout<<"Please input your inite password(limited 10 chars):"; cin>>pwd; 8 H' I2 s" w( ?* S$ X5 f char userpwd[10]; cout<<"Please input your password:"; 6 q; [! S/ A1 t. c# {; g _$ n+ ? cin>>userpwd; $ Q/ Y /0 I) U- O cout<<"pwd :"< 9 h! v8 E' W) q* o5 w. ] cout<<"userpwd:"< return 0; , S$ t# R& J6 ? } ! m/ ?2 v# {* z- x6 c& q: D 实验表明,缓冲区溢出会出现两种风险: ①相邻该缓冲区的内存空间容易被覆盖,如果被覆盖的内容很关键,就可能造成非常严重的安全隐患。②通过覆盖运行栈中函数的返回地* r+ s. k- j+ T/ d, r
上面的这段介绍是从 PC_Lint 的自述文档中摘拷贝出来的,它的优点我用亮色突出显示了。PC-lint软件性价比高,易于学习,容易推广和固化到软件开发测试流程中去,所以在全世界得到了广泛的应用。PC-lint使用方法很简单,可以用命令行方式进行,例如lint-nt –u std.lnt test1.c test2.c test3.c 也可以使用MAKEFILE的方式。此外,它还可以集成到很多开发环境或常用的代码编辑软件中,比如集成到Source Insight/SLICKEDIT/MS VC6.0/KEIL C..等。PC-Lint还支持Scott Meyes的名著(Effective C++/More Effective C++)中说描述的各种提高效率和防止错误的方法。; U4 @+ k L6 U, B& I2 G% K 第十步,对话框询问是否使用现在生成的std_x.lnt文件取代std.lnt文件。+ U1 o% Z" l4 [# i% L# a5 ?6 X9 Y 第十一步,接下来将会准备产生一个控制全局编译信息显示情况的选项文:OPTIONS.LNT,该文件的产生方式有两种,一种是安装程序对几个核心选项逐一解释并提问你是否取消该选项,如果你选择取消,则会体现在OPTIONS.LNT文件中,具体体现方式是在该类信息编码前加-e,后面有一系列逐一选择核心选项的过程。如果选择第二种选择方式,安装文件会先生成一个空的OPTIONS.LNT文件,等你以后在实际应用时加入必要的选项。: m2 j9 [& v5 q: u$ P# O- C
; n0 ?6 O% w R: X( P
' M' _/ W4 W! d Z* O5 w
; p3 X* E ]; D
k q4 g6 k7 ?. L5 I9 B& `0 B 在进行检测时,先用工具PC-lint (Project Creation)生成一个projectname.lnt,再用工具PC-lint(Project Check)来检测。
9 o9 [/ t% H0 ?7 m$ ~* J# q
" x1 z( /( C" H/ R- l7 z6 k
|
Editplus和Source Insightde 的检查环境类似,所以借用env-si中的环境配置,配置的参数如下图示:0 H4 ]9 d$ f1 n* [* x' q/ |- Z: u
菜单文本:PC_Lint(Simple Check)+ Z1 [4 g# B6 O1 t& B2 x
0 k( V, y3 D5 [" C- M v
命令: C:/Lint/lint-nt.exe5 Q. m. W- o, H9 f
/ d, ?* N) y( e0 W4 s; |& O7 B: ~
参数: -i"c:/lint" std.lnt env-si.lnt $(FileName)2 u' |; N: s! S, E+ q4 V: W
起始目录:$(FileDir)2.6 PC_Lint常用选项(opitions)的解释
2 D; T+ T( Z2 j1 L5 n
常用参数的设置4 L5 h3 N# |- E- J- /9 i" e3 |
/ ?1 X/ l2 G) Y
Message的分类:: h9 h# d4 d) B5 ~1 w, S9 I0 C( V
( E* ~7 V% _; k7 B0 |# T! x$ T
C C++ Warning Level / }9 T+ r+ V% R% M8 ]
Syntax Errors 1 – 199 1001 – 1199 1
Internal Errors 200 - 299 0 " Z0 [1 B5 P% V+ t+ h/ v) G
Fatal Errors 300 - 399 0 + r* f( N# c$ R
Warnings 400 – 699 1400 – 1699 2
Informational 700 – 899 1700 – 1899 3 ! ]7 F, X+ {! r6 C
Elective Notes 900 - 999 1900 - 1999 4 * K8 z) D9 F' s- ?3 @# T
6 e0 ?9 C7 d0 m0 n$ |
/ E1 I& J, b V' x+ t; w. [
错误信息禁止选项说明$ t$ u7 e! w4 D# [7 u$ s
命令格式 说明 代码中的举例 + U! Y2 J: b: l, X' v# q6 c
-e# 隐藏某类错误 /*lint -e725 */ 9 V0 q/ _3 | _: L Y8 Z
-e(#) 隐藏下一表达式中的某类错误 /*lint –e(534) */
printf(“it’s all”);
!e# 隐藏本行中的错误 /*lint !e534*/ printf(“it’s all”); ( e. u/ V" /0 G$ l$ t1 |
-esym(#, Symbol) 隐藏有关某符号的错误 /*lint –esym(534, printf)*/ 3 U/ /( n& E0 V3 t& N
printf(“it’s all”); , Z, D: J/ z2 P7 a+ m
-elib(#) 隐藏头文件中的某类错误 /*lint –elib(129) */ 2 U- ~! c9 _" E& m; @. |
#include “r01.h”
-efunc(#, ) 隐藏某个函数中的特定错误 /*lint –efunc(534, mchRelAll)*/
unsigned int mchRelAll(mchHoData
*pHoData) 4 c; @1 q; x, A B8 c8 v9 w1 b2 r
{
printf(“it’s all”); + V: b3 n2 l' J0 `# N/ K
} @ k( C6 A. g5 y$ o# R
PC-Lint检测中的常见错误 8 w# c3 g/ `5 n# l8 q3 l: z2 y
错误编码 错误说明 举例
40 变量未声明
506 固定的Boolean值 char c=3;
if(c<300){} 4 I" j$ V& w8 }% |2 f) x
525 缩排格式错误 , m/ K- t6 |; l& L- j) g
527 无法执行到的语句 if(a > B) 1 T; Z- r- N& d( n
return TRUE; $ C2 N" [1 N! /# j1 g" [2 U4 `
else 6 U0 s: Y- t p v6 f, h8 e
return FALSE; 9 i! ^" g; _, I* n- v$ F- [$ b
return FALSE; , o! O3 [: I- z
529 变量未引用检查变量未引用的原因 $ w: {; C9 ~2 c b: H
530 使用未初始化的变量
534 忽略函数返回值
539 缩排格式错误 6 s2 y4 D1 H, P4 e% {
545 对数组变量使用& char arr[100], *p; 8 U7 r" {/ u# G, A) R$ n5 n$ ]; ^
p=&arr;
603 指针未初始化 void print_str(const char *p); 9 j, o* {3 c0 w
…
char *sz;
print_str(sz);
605 指针能力增强 void write_str(char *lpsz);
…
write_str(“string”); / X4 h; T4 j! j
613 可能使用了空指针
616 在switch语句中未使用 break; 2 o; i1 k# K# L
650 比较数值时,常量的范围超过了 if( ch == 0xFF ) ...
变量范围 " {/ M; M6 G, Z- }
713 把有符号型数值赋给了无符号型
数值 1 ]% F& T$ k' K9 t
715 变量未引用 1 u' Y( ^1 E9 F* /9 u
725 Indentation错误 ; G& j% J. u: M( g
734 在赋值时发生变量越界 int a, b, c;
…
c=a*b; 0 V: x8 r, x) S! v0 n3 U; J; @/ e1 D7 S
737 无符号型变/常量和有变量型
变/常量存在于同一个表达式中。
744 在switch语句中没有default
752 本地声明的函数未被使用
762 函数重复声明
774 Boolean表达式始终返回真/假 char c; if(c < 300)
3.1 its4 的相关介绍
% a2 p: R) t8 w: p3 s6 ^% G7 D
ITS4: Software Security Tool
Cigital developed ITS4 to help automate source code review for security. ITS4 is a simple tool that statically scans C and C++ source code for potential security vulnerabilities. It is a command-line tool that works across Unix and Windows platforms. . V }# X- @. d) G
ITS4 scans source code, looking for function calls that are potentially dangerous. For some calls, ITS4 tries to perform some code analysis to determine how risky the call is. In each case, ITS4 provides a problem report, including a short description of the potential problem and suggestions on how to fix the code.
ITS4 and its source code are provided here to the security community for any use that does not compete with Cigital's consulting practice. 4 t# N. r4 d M q- F( v$ /
4 o1 o( @4 |7 }2 t* o! A
3.2 怎么安装ITS4+ K8 {" M+ q3 q; J- s( X
ITS4 同其他windows 平台上的软件不同,它没有可执行的安装文件,从网站上下载下来的全部是ITS4的源代码(因此它的归属公司声称它为自由软件),所以必须编译和链接这些源文件,不过不用怕,它还给我们提供了一个名 MAKEFILE 的文件,在windows环境下,我们只要在使用nmakefile –f MAKEFILE 就可以生成一个可执行文件its4.exe。. I4 }5 ]% B% f7 L X' F5 U
8 t w% h: r! ]8 O, V m: O
3.3 在命令行方式下使用ITS4
完成之后,如果你的当前目录不是 C:/its4/,那么你在除ITS4存放目录之外的其他目录下不能执行 its4 命令的(即使你已经设置过了环境变量),因为在执行这个命令的过程中,它会在C:/its4/下搜索一个名为vulns.v4d 的文件,如果失败,则这个命令就不能被正常执行。所以将编译后的整个its4目录复制到C盘生成C:/its4/.
这样你就可以正常执行了 its4 命令了。如果你嫌输入its4 命令的目录太长,你可以将C:/its设置为环境变量,这样你就可以在任意目录下 执行这个命令来检测你的源代码了。
3 i9 s# d" j/ S- j. _! z
3.4 在编辑器和编译器环境下使用ITS4
由于将its4 添加为编辑器和编译器的操作同PC_Lint差不多,所以这里就不罗嗦了。但要提醒的是,一定要注意配置Visual Studio 6.0 和 Visual Studio 8.0 时,参数项和初始目录有所不同,前者为 $(FileName)$(FileExt)/ $(FileDir)后者为$(ItemFileName)$(ItemFileExt)/ $(ItemDir)0 P% r. q# f1 `2 J# b" ?
4. 怎样的代码算是安全的代码, l3 e, o2 j3 X& U5 i
H3 G- z1 T" k0 q$ Q
4.1. 尽量少使用(或不使用)存在严重安全的C语言库函数
& m9 |. |7 ]' q4 m$ g& x1 l
由于C 语言自身的支持库存在本质上的安全隐患,由此引发出C 程序设计中存在多方面的安全问题。如下面的这些可能引发缓冲区溢出错误的函数:
; R" ^& S8 ^" D2 t* /
Strcpy() strcat() printf() scanf() gets() put() ……
' E# B8 e. s( F- Y! h" A
7 L' n5 Y: W: @6 W7 W8 D
在使用到这些函数的时候,我们应该尽量找其他一些更安全的函数来替换,如下: 6 z5 j }) U Y
Strncpy() strncat() fscanf(stdin, "%255s", buffer)……
, X8 R# d5 `" S
下面的例子演示了怎样安全的写代码:, M( h; b8 m" [5 u/ C# o
不正确情况 正确的情况 5 g$ X9 H1 d) c$ [' C4 /8 S
void func(char *str) void func(char *str)
{ {
char buffer[256]; char buffer[256];
gets(buffer, str); fgets(buffer, sizeof(buffer) –1,stdin); . p8 U( e$ ~( K% v
return; return;
} }
! d3 y" Z4 V5 H9 o
5.1. 按照如下书中所诉说的标准和规范:/ }0 g( `5 P, ]9 @
; C* Q6 V8 G; P. K
《More Effective C++》、《C++编程规范》
5.2.遵循行业行规& L4 x* r4 R- @& E0 m9 a: k
我的建议是遵循行业行规,严格按照规范写程序6. 用PC_Lint 、ITS4分别检测源代码示例, s! d* b' f* ?. r# e
下面是一个用ITS4检测一个名为a.cpp源文件时的报告:
源代码:$ o* q1 f0 b! A _! /% K1 @7 h( l
#include % K/ f- B; ^% Z) i: H6 y m
void main()
{
printf("Hello Makefile!");
char ch[50];
gets(ch,stdin);
scanf("%c",ch); % ~. p% r8 @) d
} 7 T5 c2 R# a$ @% K$ J: F4 C2 D
( Q/ R+ o! Z8 l( b* r0 |: y0 x
) f& C0 b7 m9 |: U3 d
检测报告:
! _/ c# G4 W& G$ ?8 h! ?
a.cpp:7:(Urgent) gets # c; w) O8 g& M; `2 O
The input buffer can almost always be overflowed. : f0 c9 S) J- N4 a: R; w
Use fgets(buf,size,stdin) instead. / { M* W1 @9 s' E3 e3 |
----------------
a.cpp:5:(Urgent) printf 1 U: M m; O) p
Non-constant format strings can often be attacked.
Use a constant format string. $ t2 _; d" x0 ~' o
---------------- / X" e5 m8 o# p8 i2 o. g* R
9 W$ {2 L' i- {5 }
5 ~. B! _' F. a( D6 y% r6 F; P* k
下面是一个用PC_Lint检测一个名为testpc.cpp源文件时的报告:8 /3 q; W7 `, w0 s6 e6 p; Y
; }9 X! J0 I4 Q+ i
源代码:
9 R/ z: |) |; B/ @9 Z! ^
#include
using namespace std;
int main()
{
int*fo; + h9 H% Z& q3 E2 W8 ?- t2 D- B
fo[1] = 3;
fo = new int(10);
for (int i = 5 ; i < 15 ; i++ ) 4 G" e* T6 p' k t9 y/ D- q1 O
{ / h; R! h8 h2 _/ T5 o4 j5 C& V% Q4 p
fo = i;
cout<<"fo["<
: w6 @+ U, o. h
检测报告:
1 int main()
2 ……………… r9 u2 Z) j- d) O |
3 int*fo;
4 testpc.cpp(5) : Note 970: Use of modifier or type 'int' outside of a typedef ' {, @4 x3 b0 l: O2 Q r1 V3 p
5 [MISRA Rule 13] ' F/ Z% {9 M3 |, c) H& ?
6 _
7 fo[1] = 3;
8 testpc.cpp(7) : Warning 530: Symbol 'fo' (line 5) not initialized [MISRA Rule
9 30]
10 ………………… ^. R3 O6 W) Z, y* p0 o4 R
11 _
12 fo = new int(10); 9 a" ^( ]1 G8 J8 N1 D/ { Y
13 testpc.cpp(9) : Note 970: Use of modifier or type 'int' outside of a typedef & k5 m7 ? L2 n, k
14 [MISRA Rule 13] 5 _. F( e& ^7 X5 H* D- w: p2 X7 E
15 testpc.cpp(9) : Warning 1556: 'new Type(integer)' is suspicious 4 E) h: b; I/ `' c5 m4 ~
16 _
17 for (int i = 5 ; i < 15 ; i++ )
18 testpc.cpp(12) : Note 970: Use of modifier or type 'int' outside of a typedef : }. c* ]/ a) F* I* Y* n% V. v2 o
19 [MISRA Rule 13]
20 …………………
21 _
22 fo = i;
23 testpc.cpp(14) : Warning 662: Possible creation of out-of-bounds pointer (5 7 T# u& e- p3 d" O2 ?$ Q
24 beyond end of data) by operator '[' [Reference: file testpc.cpp: lines 9, 3 c' G Y8 K# v8 I3 ]2 ^
25 12, 14]
26 ………………… ' P" y3 G# F: t0 u+ Z
27 _ 0 b; c% R0 A/ n k6 w/ K( U
28 cout<<"fo["<<i<<"]="<<fo<<endl;
29 testpc.cpp(15) : Warning 662: Possible creation of out-of-bounds pointer (5 3 |) T& S( Z# H, ]/ B" ]
30 beyond end of data) by operator '[' [Reference: file testpc.cpp: lines 9, 9 u3 A E: f' R* D0 E. W* L/ O: i
31 12, 15]
32 …………………
33 _
34 return 0; ) p9 y, ~$ Z% ^5 d% l
35 testpc.cpp(17) : Warning 429: Custodial pointer 'fo' (line 5) has not been & W& n" j% Y+ A ]$ o
36 freed or returned 7 // W0 P: k" I7 l4 d! _
37
0 `; P, a: f/ G2 s$ O+ [
报告分析:
0 L3 n. N' H* i9 p' t2 |; N1 ]3 {3 P
在这份报告中,PC_Lint检测出了许多Visual Studio 8.0 不能检测出的潜在问题,如:
( E- d5 ^5 x5 b, G# m) o" k4 ^
在上面的第8行报告使用了为初始化的变量fo;* b! o/ m! C6 b/ d( /0 o9 G
在上面的第23、29行报告使用的指针索引可能越界了;$ I, W" W& k! m/ P5 b! /
% V$ I& ?0 x0 N2 i( ?( H% B9 L* D0 V
在上面的第35行报告程序中动态申请的空间没有释放。
源代码安全检测工具PC_Lint与ITS4实例 zz相关推荐
- CoBot 库博源代码缺陷检测工具
CoBot 库博源代码缺陷检测工具 支持10种语言(java暂时不支持) 支持压缩包.本人现场观测厂家演示GIT\SVN导入 29000行代码检测大概1分钟完成 可以自定义 缺陷检测项 其它同类开源: ...
- 静态源代码安全检测工具比较
静态源代码安全检测工具比较 1. 概述 随着网络的飞速发展,各种网络应用不断成熟,各种开发技术层出不穷,上网已经成为人们日常生活中的一个重要组成部分.在享受互联网带来的各种方便之处的同时,安全问题也变 ...
- 11 款用于优化、分析源代码的Java工具
本文将提供一些工具,帮助你优化代码以及检查源代码中的潜在问题. 1. PMD from http://pmd.sourceforge.net/ PMD能够扫描Java 源代码,查找类似以下的潜在问题: ...
- java检测工具_常用Java代码质量检测评估工具
常用Java代码质量检测评估工具 1. PMD from http://pmd.sourceforge.net/ PMD能够扫描Java 源代码,查找类似以下的潜在问题: 可能的bug--try/ca ...
- 利用OWASP Benchmark V1.2基准对国内静态检测工具的测评分析
笔者一直从事于软件测试.软件安全方面工作,跟踪国内外软件测试工具的使用和效果.最近笔者接触了CoBOT源代码缺陷检测工具,想验证一下该工具的检测效果,于是下载了OWASP Benchmark 1.2基 ...
- 【网络运维】小平头PingTow网络IP导入检测工具软件开发源代码分享
目录 一.软件功能与截图 多Excel文档批量导入IP信息 1.文件支持选择多个Excel文档 2.Excel文件的表头要求 IP信息Ping结果列表展示 二.源码分享与设计 Maven-Pom依赖 ...
- 内存泄漏检测工具VLD在VS2010中的使用举例
Visual LeakDetector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.它的特点有:(1).它是免费开源的,采用LGPL协议:(2).它可以得到内存泄露点的调用堆栈,可 ...
- coverity代码检测工具介绍_FOREPOST:一种使用反馈驱动学习软件测试的性能检测工具...
FOREPOST:一种使用反馈驱动学习软件测试的性能检测工具 摘要 性能测试的一个目标是找出某些特定情况,在这些情况下对于某些输入值组合,应用程序意外地展示出更糟糕的特性.性能测试的一个基本问题是如何 ...
- 动态内存检测工具Valgrind
1. Valgrind查找内存泄露利器 Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析.你可以在它的环境中运行你的程序来 ...
最新文章
- Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常
- 获得WebBrowser中的图片数据
- 怎么把图片上的字盖住_吃完大闸蟹怎么去腥?实验了 12 种方法,第 1 名居然是.........
- jenkins 远程启动tomcat报错:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
- telnet linux 命令详解,解析Linux Telnet命令
- 洪水填充算法_区域填充算法和多边形填充的扫描线算法
- 设计一个程序,完成(英雄)商品的购买(界面就是第一天打印的界面) 展示商品信息(折扣)->输入商品价格->输入购买数量->提示付款 输入付款金额->打印购买小票
- 微信小程序图片缓存问题
- DTCC | 2021中国图数据库技术大会链接分享
- 巨量创意signature
- 教师办公用计算机使用管理制度,教师办公室计算机使用规章制度
- 已解决:[emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forb
- 初遇初识初知接下来是什么_娱乐圈隐藏学霸,演技零差评,张新成凭什么不火?...
- android设置UI界面背景,Android ROM定制——界面美化基础(framework-res、SystemUI修改)...
- Dubbo项目消费者调用提供者报cannot be cast to com.baomidou.mybatisplus.core.metadata.IPage
- python画带权重的图
- IEEE论文免费下载
- 产品如何选择 RF射频,RF433,RF315
- Keil系列软件安装(二)Keil5 MDk
- Nokia 5530XM