Science for all





文件描述符

文件描述符

一组“打开文件描述符”,即预先打开的文件,会传递给程序。setuid/setgid程序必须处理这样的情况,即用户开始选择哪些文件是打开的,以及打开到哪里(在他们的许可限制内)。setuid/setgid程序不应该假设打开某个新文件会总是打开到某个固定的文件描述符ID上。不应假设标准输入(stdin)、标准输出(stdout)和标准错误(stderr)总是指向某个终端或者总是打开的。

这样做的理由很简单;因为攻击者可以在启动程序之前打开或关闭某个文件的描述符,从而制造出意料之外的情况。如果攻击者关闭了标准输出,在程序打开下一个文件时,该文件会被当做标准输出打开,所有的标准输出都会被传给它。某些C库在stdin、stdout和stderr未被打开时会自动把它们打开(指向/dev/null),但并非对所有类Unix系统都是这样。