2011-06-18 71 views
2

,我是学电码防伪,我试图做一个安全性分析以下2个片段,从‘编写安全代码’拍摄,第2版:解决安全漏洞在“编写安全代码”'

http://www.di.uniba.it/~ndm/corsi/sa/materiale/lab/StackOverrun.c

http://www.di.uniba.it/~ndm/corsi/sa/materiale/lab/FormatString.c

在第一个我认为唯一的非安全声明 strcpy(buf, input); 这应该是 strncpy(buf, input, sizeof(buf-1)); 所有其他PR intf是安全的:尽管他们使用的参数少于他们应该进行的动作,但他们故意这样做。

在第二个再printf s为安全的,但fprintf(stdout, buf);是,也不应该与此代码来代替:fprintf(stdout, "%s", buf);

我的问题是pFile = fopen(argv[1], "r");也被分析程序被认为不安全由于可能的竞争条件但我看不出这可以在这段代码中被利用。如果该文件是以只读方式打开的,那么攻击者可以用它做一些令人讨厌的事情?我想不是。

所以,问题是:你认为这个分析是正确的?你能找到其他缺陷,或者是我的推理被窃听?

谢谢!

+0

您的意思是:http://www.di.uniba.it/~ndm/corsi/sa/materiale/lab/FormatString.c? –

+0

是的,对不起!我不知道它为什么没有出现! –

+3

'strncpy(buf,input,sizeof(buf-1));'仍然是错误的,因为如果源太长,它不会终止目的地。 –

回答

0

我首先想到的是,这是不好的非消毒程序的输入传入的libc调用。只是有太多的情况下,libc中会溢出,而开发人员不应该传递超过libc中的预期参数(如字符串应该是在这种情况下< PATH_MAX)。

但是既然你提到竞争状态,我认为,尽管在这种特定情况下没有特别的问题,使用fopen()函数在一般的令人难以接受的,因为它是容易出现竞争情况。如果你正在寻址一个文件,任何文件,使用取代文件名称而不是文件句柄的函数。如果您通过其路径名称引用某个文件,只需执行一项操作,则文件状态可能会发生变化,并且程序对该状态的假设可能不再正确。在下面的文章中有更好的解释。

http://www.sans.edu/research/security-laboratory/article/race-cndtns

http://www.unixprogramming.info/s_isregfile-race-conditions

+0

攻击者是否可以使用带有符号链接的fopen来了解,例如,如果某个文件他无权访问? –

+0

当然是一个例子。如果程序只是将文件捕获到标准输出中,攻击者就可以读取/ etc/shadow,例如,这很不好,但是所有的密钥都可以被读取,等等等等 –

0

Apple Development site来此明确的说明:

如果你打开一个文件,然后从中读取,即使你的应用程序什么也不做这两个操作之间,一些其他进程可能会在打开文件之后和读取文件之前更改文件。如果两个不同的进程(在相同或不同的应用程序中)正在写入同一个文件,那么就无法知道哪一个会先写入,哪个会覆盖另一个写入的数据。这种情况会导致安全漏洞。

有两种基本类型,可以利用竞争条件:使用的退房时间(TOCTOU),和信号处理时间。

此外,如图所示的fopen()调用没有对文件名进行任何消毒处理。当然你不会那么做,对吧?这个名字绝对应该被分析,检查和根本不可信,因为它是一个参数的程序。理想情况下,您应该use more than a single attribute to identify a file