版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.:.;平安编程: 防止竞争条件资源争用能够对您不利 HYPERLINK ibm/developerworks/cn/linux/l-sprace.html l author1 David A. Wheeler专职研讨员, Institute for Defense Analyses简介:了解什么是竞争条件,以及它们为什么会引发平安问题。本文向您展现了如何在类 UNIX Unix-like系统中处置常见的竞争条件,包括如何正确地创建锁文件、锁文件的替代者,如何处置文件系统,以及如何处置共享目录特别是如何在 /tmp 目录下正确创建暂时目录。需求您对信号处置稍有了解。 HYPERLINK ibm
2、/developerworks/cn/linux/l-sprace.html 标志本文!发布日期:2004 年 10 月 25 日级别:初级访问情况5 次阅读建议:0( HYPERLINK ibm/developerworks/cn/linux/l-sprace.html l icomments 添加评论)平均分 共 0 个评分 经过一个偷窃而来的口令,Mallory 胜利地登录到一台运转 Linux 的重要效力器。 其帐号是一个非常受限的帐号,但是 Mallory 知道如何运用它来制造费事。Mallory 安装并运转了一个行为非常奇异的小程序,该程序运用多个进程在 /tmp 目录下快速地 创
3、建和删除很多不同的符号链接文件。符号链接文件也称为 symlink,是一种简单的文件, 当被访问时,它会将恳求重定向到另一个文件。Mallory 的程序不停地创建和删除很多 指向同一特殊文件/etc/passwd,口令文件的不同符号链接文件。这台重要的效力器的平安措施之一是,它每天都运转 Tripwire 详细地说,是较老的 2.3.0 版本。Tripwire 是一个检测重要文件能否被篡改的平安程序。与很多程序一样,Tripwire 启动时会尝试着创建一个暂时文件。Tripwire 会查看并断定不存在名为“/tmp/twtempa19212的文件,所以看起 来这是一个适宜的暂时文件称号。但是在
4、 Tripwire 完成检查后,Mallory 的程序就会运用该称号创建一个符号链接文件。这不是偶尔的;Mallory 程序的设计目的就是创建最有能够为 Tripwire 所运用的文件名。然后 Tripwire 就会翻开该文件,开场写入暂时信息,但不用创建新的空文件,Tripwire 如今正在重写口令文件!从那时起,任何人 甚至是管理员 都不能登录到该系统,由于口令文件曾经被破坏了。更糟的是,Mallory 的攻击完全可以覆盖一切文件,包括效力器上存储的重要数据。竞争条件简介这是个假想的故事;“Mallory是攻击者的一个惯用名。但是这类攻击,以及它所利用的缺陷,都极其常见。问题是很多程序都容
5、易遭到名为“竞争条件的平安问题的影响。当由于事件次序异常而呵斥对同一资源的竞争,从而导致程序无法正常运转时,就会出现“竞争条件。留意,竞争条件无需介入同一程序的两个部分之间的竞争; 假设一个外部的攻击者可以经过意想不到的方式干扰程序,那么就会出现很多平安问题。 例如,假设 Tripwire 2.3.0 确定某个文件不存在,它就会尝试着创建该文件,而不去思索在进展这两个步骤期间,该文件能否曾经被攻击者创建。几十年前,竞争条件还不是什么问题;那时, 计算机系统通常在同一时辰只能运转一个单独的程序,什么都不能打断它或者与它竞争。 但是,当今的计算机通常需求同时运转大量的进程和线程,经常还会有多个处置
6、器确真实同时运转不同的程序。这样做更灵敏,但是有一个危险:假设这些进程和线程共享了一切的资源,那么它们都能够相互影响。实践上,竞争条件缺陷是软件的更常见缺陷之一,此外,在类 Unix 系统上,/tmp 和 /var/tmp 目录经常会被错误地运用,从而导致竞争条件。不过,我们首先需求了解一些术语。一切 类-Unix 系统都支持用户进程;每个进程都有本人的内存空间其他进程通常无法访问。底层的内核会尽量使进程看起来像是在同时运转; 在多处置器的系统中,它们确实可以同时运转。从实际上讲,一个进程可以拥有一个或多个线程;这些线程可以共享内存。线程也可以同时运转。由于线程可以共享内存,所以,相对于进程,
7、线程之间更有 能够产生竞争条件;正是由于这个缘由,多线程程序的调试要困难得多。Linux 内核有一个非常好的 根本设计:只需线程,并且一些线程可以与其他线程共享内存这样实现了传统的线程,而另外一些线程那么不能这样就实现了独立进程。为了了解竞争条件,让我们首先来看一个非常普通的 C 声明:清单 1. 普通的 C 声明 b = b + 1;看起来非常简单,不是吗?但是,让我们假定有两个线程在运转这一行代码,在这里,“b是一个 由两个线程共享的变量,“b的初始值为“5。以下是一个似是而非的执行次序:清单 2. 运用共享的“b的能够执行次序 (thread1) load b into some reg
8、ister in thread 1. (thread2) load b into some register in thread 2. (thread1) add 1 to thread 1s register, computing 6. (thread2) add 1 to thread 2s register, computing 6. (thread1) store the register value (6) to b. (thread2) store the register value (6) to b.初始值为 5,然后两个线程分别加 1,但是最终的结果是 6. 而不是应该得到的
9、 7。问题在于, 两个线程相互关扰,从而导致产生错误的最终答案。通常,线程不是以原子的方式执行的;另一个线程可以在任何两个指令期间打断它,而且还可以运用一些共享的资源。假设一个平安程序的线程没有预防这些中断,那么另一个线程就可以干扰该平安程序的线程。在平安程序中,不论在任何一对指令中间运转了多少其他线程的代码,程序都必需正确地运转。关键是,当您的程序访问恣意资源时,要确定其他某个线程能否能够由于运用该资源对您的程序呵斥干扰。处理竞争条件竞争条件的典型处理方案是,确保程序在运用某个资源比如文件、设备、对象或者变量 时,拥有本人的专有权。获得某个资源的专有权的过程称为加锁。锁不太容易处置。死锁“抱
10、死,deadly embrace是常见的问题,在这种情形下,程序会因等待对方释放被加锁的资源而无法继续运转。 要求一切线程都必需按照一样的顺序比如,按字母排序,或者从“largest grain到“smallest grain的顺序 获得锁,这样可以防止大部分死锁。另一个常见问题是活锁livelock,在这种情况下,程序至少 胜利地获得和释放了一个锁,但是以这种方式无法将程序再继续运转下去。假设一个锁被挂起,顺利地释放它会很难。简言之,编译在任何情况下都可以按需求正确地加锁和释放的程序通常很困难。有时,可以一次执行一个单独操作来完成一些特殊的操作,从而使您不需求显式地对某个资源 进展加锁而后再
11、解锁。这类操作称为“原子操作,只需可以运用这类操作,它们通常是最好的处理方案。有一些错误是如此常见,所以,为了防止犯这些错误,您需求了解它们。一个问题是,以不总是锁定 某资源的方式创建锁文件;您应该学习如何正确创建它们,或者转而采取不同的加锁机制。您还需求正确 地处置文件系统中的竞争,其中包括如何处置永远危险的共享目录 /tmp 和 /var/tmp,以及如何平安地运用信号。下一章中将描画如何平安运用它们。锁文件通常,类 Unix 系统是经过创建表示一个锁的文件来实现不同进程间共享的锁。 运用单独的文件来表示锁,是“劝告式advisory锁而不是“强迫mandatory锁的一个例子。 换句话说
12、,操作系统不会强迫您经过锁来共享资源,所以,一切需求该资源的进程都必需协同运用该锁。这看起来好似很简单,但并不是一切简单的主意都不是好主意;创建单独的文件,就可以方便地获得系统的形状,其中包括哪些资源被加锁了。假设您运用这种方法,有一些规范的技巧可以简化这些锁 的去除,详细地说,是删除那些挂起的锁。例如,一个父进程可以设置一个锁,然后调用一个子进程 来执行任务确保父进程可以有效地调用子进程,当子进程前往时,父进程释放该锁。或者, 可以运用 cron 作业来查看那些锁其中包括进程的 id;假设进程没有处于活动形状,那么该作业就会 去除那些锁,并重新启动相应的进程。最后,锁文件的去除可以作为系统启
13、动的一部分从而使您的锁在系统忽然解体之后不再处于挂起形状。假设您正在创建单独的文件来表示锁,那么要留意一个常见的错误:对creat()或者与之相当的open()的 调用方式为 O_WRONLY | O_CREAT | O_TRUNC。问题是,root总是可以这样创建文件, 即使锁文件曾经存在,这意味着该锁不能为 root 正常任务。简单的处理方案是在运用open()时指定标志 O_WRONLY | O_CREAT | O_EXCL将权限设置为 0,使同一用户的其他进程无法获得该锁。留意 O_EXCL 的运用,这是创建“公用文件的正式 途径;甚至在本地文件系统上,root 也可以这样做。这个简单
14、的方法对 NFS 版本 1 或者版本 2 不适用;假设必需在运用这些老的 NFS 版本衔接的远程系统上运用锁文件,那么可以运用 Linux 文档中给出的方案:“在一样的文件系统上创建一个独一的文件例如,结合主机名和 pid,运用link(2)来创建一个指向锁文件的链接,运用stat(2)来检查该独一文件的链接计数器能否添加到了 2。 不要运用link(2)调用的前往值。假设您运用文件来表示锁,那么要确保这些锁文件放置在攻击者无法利用例如,不能删除它们或者添加干扰它们的文件的位置。典型的处理方案是运用一个目录,使该目录的权限根本不允许未经授权的程序添加或者删除文件。确保只需您可以信任的程序 才干
15、添加或者删除锁文件!文件系统层次构造规范Filesystem Hierarchy Standard,FHS得到了 Linux 系统的广泛 运用,同时还引入了这类锁文件的规范商定。假设您只是希望确保您的效力器在一台给定的机器上 运转不超越一次,那么您通常应该创建一个名为 /var/run/NAME.pid 的进程标识符,以进程 id 作为文件内容。根据同样的思绪,您应该将设备锁文件之类的锁文件放置在 /var/lock 中。 HYPERLINK ibm/developerworks/cn/linux/l-sprace.html l ibm-pcon 回页首锁文件的替代者运用单独的文件来表示锁是一
16、个非常古老的方法。另一个方法是运用 POSIX 记录锁record locks, 它经过fcntl(2)实现为一个恣意的锁。采用 POSIX 记录 锁的理由有很多:POSIX 记录锁在几乎一切的类 Unix 平台上都获得了支持它得到了 POSIX.1 的授权,它可以锁定文件的一部分而不是只会锁定整个文件,而且它可以区别处置读锁和写锁的不同之处。此外,假设一个进程死掉,那么它的 POSIX 记录锁就会自动被删除。只需一切程序都共同协作的时候,运用单独的文件或者fcntl(2)恣意锁 才干生效。假设您不喜欢该思想,那么可以转而运用 System V 风格的强迫锁。强迫锁允许您锁定一个文件或者它的一
17、部分,使每一次read(2)和write(2)都检查锁,任何没有持有该锁的操作都将被挂起,直到该 锁被释放为止。这样做能够略微方便一些,但也有其缺陷;拥有 root 特权的进程也能够被强迫锁挂起,这样 通常容易呵斥回绝效力denial-of-service攻击。实践上,回绝效力问题是非常严重的,因此通常要防止运用强迫锁。强迫锁是可用范围很广,但它不是通用的;Linux 和基于 System V 的系统支持这种锁,但其他的类 Unix 系统不支持它。在 Linux 上,为了启用强迫文件锁,必需用特定的方式装配文件系统,因此很多配置在默许情况下不支持强迫文件锁。在一个进程内部,线程能够也同样需求锁
18、;有很多书都非常详细地讨论了这些问题。在这里,我们要讨论的主要问题是确保您小心地涵盖了一切情况;很容易忘记某个特定情形,或者没有正确处置。现实上,正确运用锁是很难的,攻击者能够利用这些锁处置中的错误。假设您需求在一个进程内部对线程运用很多锁,那么可以思索运用自动完成锁的维护的言语或者言语构造。有很多言语,比如 Java 和 Ada95,都有内置的可以自动处置锁维护并使结果有能够更正确的言语构造。只需有能够,在开发程序时最好根本不运用锁。一个单独的效力器进程每次只接受一个客户机恳求,然后处置该恳求,直到完成该恳求为止,而后再获得下一个恳求,从某种意义上讲,进程内部的一切对象是被自动锁定的;这种简
19、单的 设计可以防止很多危险的加锁问题。假设您需求一个锁,那么坚持其简单性比如为几乎一切内容都运用独一的锁是有益处的。这并不总是适用的,由于这样设计有时会损害性能。详细地说,单效力器系统需求确保无论哪个操作都无法占用过长的时间。但是这个建议是值得思索的;运用很多锁的系统会更能够有缺陷,而且维护这些锁也会影响性能。 HYPERLINK ibm/developerworks/cn/linux/l-sprace.html l ibm-pcon 回页首处置文件系统平安程序的编写必需确保攻击者无法以导致问题的方式利用共享的资源,有时这并不 像看起来那样容易办到。文件系统是最常见的共享资源之一。一切的程序都
20、可以共享文件系统, 所以,有时需求额外的努力,以确保攻击者不能以引发问题的方式利用文件系统。有很多确定为平安的程序都存在称为“time of check - time of useTOCTOU的竞争条件缺陷。这只阐明了程序检查某种情形能否可行,然后稍后运用那一信息,但是攻击者能够会在这两个步骤之间改动该情形。对文件系统来说,以下问题尤为突出;在这两个步骤之间,攻击者通常可以创建一个普通的文件或者一个符号链接。例如,假设某个已授予特权的程序检查能否不存在给定称号的文件,然后翻开该文件写入信息,那么在那两个步骤之间,攻击者可以创建一个运用该称号的符号链接文件. 比如 /etc/passwd 或者其
21、他一些敏感文件。遵守一些简单的规那么,可以防止这些问题:不要运用access(2)来断定您能否可以做某件事情;通常攻击者会在调用access(2)后改动该情形,所以,经过调用access(2)获得的任何数据都能够不再是可信任的。换一种方式, 将您的程序的特权设置得恰好是您想要的特权例如,设置它的有效 id、文件系统 id 或者有效 gid,并经过 setgroups 来去除一切不需求的组;然后调用open(2)直接翻开或创建您需求的文件。在类 Unix 系统上,open(2)调用是原子的与以前的 NFS 系统版本 1 和版本 2 不同。当创建一个新文件时,运用 O_CREAT | O_EXCL
22、 方式翻开它确保只需在创建一个新文件时调用 O_EXCL 才会胜利。最初只授与非常有限的权限;至少制止恣意的用户修正它!通常,这表示您需求运用 umask 和/或翻开参数,将初始的访问权限局限于用户,也可以局限于用户所在的组。不要尝试在创建完文件后再去减少权限,由于这样做会导致竞争条件。在大部分类 Unix 系统上,只在翻开文件时才检查权限,所以,攻击者可以在权限位permission bit允许时翻开文件,并使该文件不断处于翻开形状,不论权限如何改动。假设您情愿,还可以在以后将权限修正得更 为开放。您还需求为翻开失败做好预备。假设您绝对需求能翻开某个新文件,那么应该创建一个循环:1创建一个“
23、随机的文件名,2运用 O_CREAT | O_EXCL 选项翻开文件,3胜利翻开文件后停顿循环。当对文件的元信息进展操作时比如修正它的一切者、对文件进展统计,或者修正它的权限位,首先要翻开该文件,然后对翻开的文件进展操作。只需有能够,应尽量防止运用获取文件名的操作,而是运用获取文件描画符的操作。这意味着要运用fchown( )、fstat( )或fchmod( )系统调用,而不运用获得文件名的函数,比如chown()、chgrp()和chmod()。 这样做将防止文件在您的程序运转时被交换一种能够的竞争条件。例如,假设您封锁一个文件,然后运用chmod()来修正其权限,那么攻击者很能够在这两个
24、步骤之间挪动或删除该文件,并创建指向另一个文件比如 /etc/passwd的符号链接。假设您的程序需求遍历文件系统递归地遍历子目录,那么要提防攻击者能够会利用您正在遍历的 目录构造。这种情形的一个常见的例子是,运转您的程序的管理员、系统程序或者有特权的效力器 正在遍历的是由普通用户控制的文件系统部分。GNU 文件适用程序fileutils可以完成递归目录 删除和目录挪动,但是在版本 4.1 之前,当遍历目录构造时,它只是简单的遵照“.这个特殊条目。 当文件被删除时,攻击者可以将一个低层级的目录挪动到更高的层级;fileutils 将会遵照“.目录 向上到更高层级,能够会不断到文件系统的根。经过
25、在适当的时间删除目录,攻击者可以删除计算机中 的任何文件。您不应该信任“.或“.,假设它们是由攻击者控制的。假设可以,不要将文件放置在可以由不信任用户共享的目录中。假设不是那样,那么应该尽量不运用在用户间共享的目录。不要介意创建只能由受信任的特定进程访问的目录。思索防止运用传统的共享目录 /tmp 和 /var/tmp。假设您可以只运用一个管道,将数据从一个位置发送到另一个位置,那么您就可以简化程序,并排除潜在的平安问题。假设您确实需求 创建一个暂时文件,那么可以思索将暂时文件存储到其他地方。假设您不是在编写一个有特权的程序,那么这点尤其需求思索;假设您的程序没有特权,那么将暂时文件放置在用户
26、目录内部会更平安一些处置 root 用户时要留意,它以“/作为其主目录。这样,即使您没有“正确地创建暂时文件,攻击者通常也无法引发问题由于攻击者不能利用用户主目录的内容。但是,无法总是可以防止运用共享目录,所以我们需求了解如何处置 /tmp 等共享目录。 这一点非常复杂,所以它应该本人占用一节! HYPERLINK ibm/developerworks/cn/linux/l-sprace.html l ibm-pcon 回页首共享目录比如 /tmp共享目录根本概念假设您可信任的程序将要与潜在的非信任用户共享一个目录,那么要特别小心。在类 Unix 系统中,最常见的共享目录是 /tmp 和 /v
27、ar/tmp,对这些目录的错误运用繁殖了很多平安缺陷。最初创建 /tmp 目录,是将它作为一个创建暂时文件的方便位置,通常不应该与任何其他人共享暂时文件。不过,该目录很快它就有了第二个用途 创建用户间共享对象的规范位置。由于这些规范目录有多种 用途,使得操作系统难以加强访问控制来防止攻击;因此,您必需正确地运用它们,以 防止遭到攻击。当您运用共享目录时,确保目录和文件有适当的权限。显然,您需求限制哪些人可以对共享目录中创建的文件进展读写操作。但是,在类 Unix 系统中,假设多个用户都可以向同一目录添加文件,而且 您方案经过一个有特权的程序向该目录添加文件,那么要确保为该目录设置“sticky
28、位。在一个普通的目录中没有 sticky 位,任何人对它都有写权限 包括攻击者 可以删除 或者重命名文件,导致各种各样的问题。例如,一个可信任的程序可以在这样一个目录下创建一个 文件,而一个不受信任的用户可以删除或者重命名它。在类 Unix 系统上,需求设置共享目录的 “sticky位;在 sticky 目录中,文件只能由 root 或者文件的一切者解除链接或者重新命名。/tmp 和 /var/tmp 目录通常实现为“sticky目录,以排除一些问题。程序有时会留下一些没用的暂时文件,所以,大部分类 Unix 系统会自动删除特定目录 /tmp 和 /var/tmp 下的原有暂时文件“tmpwa
29、tch程序可以完成这项义务,一些程序会“自动删除它们所运用的特定暂时目录下的文件。这听起来很方便.只惋惜 攻击者能够会让系统特别忙碌,使活动文件成为旧文件。结果:系统能够会自动删除正被运用的文件称号。然后会发生什么?攻击者能够会尝试创建他们 本人的一样称号的文件,或者至少让系统创建另一个进程,并重新运用一样的文件称号。 结果:混乱。这类问题叫做“tmpwatch问题。处理这种问题的方法是,一旦自动创建了一个暂时 文件,就必需一直运用翻开该文件时得到的文件描画符或文件流。永远不要重新翻开 文件或者运用任何以文件为参数的操作 一直运用文件描画符或者相关的流,否那么,tmpwatch 竞争将引发一些
30、问题。您甚至无法先创建文件、然后封锁它、然后再重新翻开它,即使权限曾经限制了谁可以翻开该文件。攻击 sticky 目录以及您创建的文件的受限权限只是第一步。在运转平安程序期间,攻击者能够会尝试进展插入操作。常见的一种攻击是,当您的程序正在运转时,在共享目录中创建和反创建指向其他一些文件的符号链接 /etc/passwd 或者 /dev/zero 是常见的目的。攻击者的目的是,发明这样一种情形,即让平安程序断定某个给定的文件名并不存在,然后,攻击者就可以创建指向另一个文件的 符号链接,而后平安程序继续执行某些操作但是如今,它翻开的实践上是一个预料之外的文件。重要的文件经常会被这样破坏或更改。这种
31、做法的另一个变种是,创建和反创建攻击者可以进展写操作的普通文件,这样,攻击者有时就可以控制有特权的程序创建的“内部文件。在这些共享目录中创建文件时,常遇见的一个问题是,您必需确保您方案运用的文件名在创建时并不存在,然后自动创建该文件。在创建该文件“之前进展检查没有用,由于在曾经进展了检查但还没有创建该文件之前,另一个 进程可以运用该文件名创建出这个文件。运用“不可预知的或者“独一的文件名也没有用,由于攻击者可以反复猜测该文件名,直到胜利为止。所以,您需求执行一个或者创建一个新文件或者失败的操作 不做其他任何事情。类 Unix 系统可以这样做,但是您需求知道如何要求系统去做。共享目录的处理方案不
32、幸的是,有很多并不是处理方案。有一些程序只是直接调用mktemp(3)或tmpnam(3)来创建暂时文件,然后基于这样做会胜利的假定去简单地翻开它。错误的方案!实践上, 线程运用tmpnam(3)并不可靠,也不能可靠地处置循环, 所以永远不要运用它。1997 年的“Single Unix Specification引荐运用tmpfile(3),但不幸的是,在一些老系统上实现它很不平安。在 C 中,为了在共享sticky目录中平安地创建暂时文件,通常的处理方案是将umask()值设置为一个非常受限制的值,然后反复进展以下操作: 1创建一个“随机的文件名,2运用 O_CREAT | O_EXCL
33、选项 open(2) 它 这将自动创建文件,假设没有创建该文件,那么操作失败,3当胜利翻开文件时停顿反复步骤。C 程序员实践上不需求直接这样去做;只需求调用库函数mkstemp(3),就可以翻开文件。mkstemp(3)的一些实现并没有将umask(2)设置为一个受限的值,所以聪明的做法是先调用umask(2)来强迫将文件设置为受限的值。有一个 小费事,mkstemp(3)不直接支持 TMP 或 TMPDIR 环境 变量,所以,假设这对您来说是重要的,那么您必需做更多的任务。当为了平安地翻开暂时文件而在共享暂时目录中创建文件系统对象时,GNOME 编程 导游引荐您运用下面的 C 代码:清单 3
34、. 引荐运用的创建暂时文件的 C 代码 char *filename; int fd; do filename = tempnam (NULL, foo); fd = open (filename, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, 0600); free (filename); while (fd = -1); 留意,虽然运用了不平安的tempnam(3)函数,但是它 被包装在循环中,并运用了 O_CREAT 和 O_EXCL 选项,从而抵消了它的平安弱点, 所以这样做是可以的。一个附带益处是,tempnam(3)通常 运用 TMPDIR,这使得用户可
35、以重定向其暂时文件,假设需求的话。留意,您需求free()文件称号。完成运用之后,您应该close()并unlink()文件。 这种方法有一个小的缺陷,由于能够无法平安运用 tempnam,所以各种编译器和平安扫描器能够都会向您发出运用不合逻辑的警告。运用mkstemp(3)就不存在这个问题。整个这个翻开文件的方法展现出了规范的 C IO 库的一个奇特之处:没有规范的方法来指定 O_EXCL 选项运用fopen(),所以您不能以“普通的 C 方式来翻开文件,并平安地创建暂时文件。 假设您想运用规范 C IO 库,然后运用open(),那么您可以运用指定“w+b 方式的fdopen(),将文件描
36、画符转换为一个 FILE *。Perl 程序员应该运用 File:Temp,它尝试提供一个平安创建暂时文件的跨平台方法。 不过,首先要仔细阅读如何正确运用它的文档;它同样有不平安的函数接口。我建议您显式地将 safe_level 设置为 HIGH;这样就会调用附加的平安检查。对大部分编程库来说 都是如此;大部分库都既有平安接口,又有不平安接口,所以您需求查阅文档,并确保选择了平安的版本。留意,在旧版的 NFS版本 1 或者版本 2的目录上运用 O_EXCL 是没有用的,由于 NFS 的这些旧版本没有正确地支持 O_EXCL。假设您本人运用了 O_EXCL,而且共享目录是运用这些旧版 NFS 实
37、现的,那么您的程序将是不平安的。实践上,关于旧版 NFS 中link(2)和stat(2)的运用有一个 复杂的处理方法;假设您的程序一定要在这样的环境中任务,那么您可以在 Linux 的open(2)手册页或者其他地方阅读关于该方法的内容。 在这里我不预备对它进展讨论,由于即使您的程序可以与旧版的 NFS 一同运用,您所 运用的很多其他程序也不会运用该处理方法。无论如何您都不能够获得运用 NFS 版本 1 或者 版本 2 的暂时目录的平安系统,由于其他程序没有运用该处理方法,所以,假设运用 远程挂载的暂时目录,更明智的做法是要求运用 NFS 版本 3 或更高版本。您可以尝试运用mkdtemp(
38、3),但这通常不是一个好主意,由于 暂时文件去除器temp cleaners能够会决议去除它们。假设您正在编写 shell 脚本,那么可以运用管道,或者在用户的主目录存入暂时文件。根本不要运用 /tmp 或 /var/tmp 目录;普通的 shell 通常无法支持文件描画符,所以暂时文件去除器 tmpfile cleaners最终将使它们失败。假设没有暂时文件去除器,而且您只是必需在 /tmp 中创建暂时文件,那么至少要运用mktemp(1)来防止更明显的 攻击,由于mktemp(1)不是mktemp(3)将 运用 O_EXCL 来防止典型的竞争条件攻击。您能够做的最糟糕事情通常也是最令人不安的事: 假定“$没有被攻击者猜出来,并且只是将信息重定向到这类文件;那么在创建时就不会按要求运用 O_EXCL 方式。攻击者可以简单地预创建类似的文件,或者反复创建和删除它们,最终接纳程序。 这样,类似的 shell 脚本几乎一定有一个严重的缺陷:清单 4. 有缺陷的 shell 脚本 echo This is a test /tmp/test$ # DONT DO THIS. 不要再次运用暂时文件称号即不要删除和重新创建文件,不论您最初是如何获得“平
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 46925-2025绿色电力术语
- 2026河南漯河市召陵区公益性岗位招聘5人考试备考试题及答案解析
- 2006云南昆明晋宁产业园区管理委员会招聘编外人员3人考试参考题库及答案解析
- 2026年合肥市园上园小学喻岗分校教师招聘考试备考题库及答案解析
- 2026广西来宾市忻城县职业技术学校城镇公益性岗位人员招聘1人考试参考试题及答案解析
- 2026山东烟台市教育局直属单位、学校第二批面向社会招聘教师、教研员18人考试备考试题及答案解析
- 2025江西九江市寻阳实业集团有限公司招聘延期考试备考试题及答案解析
- 2026上海烟草集团嘉定烟草糖酒有限公司应届生招聘1人考试参考试题及答案解析
- 2026浙江嘉兴幸福嘉保安服务有限公司招聘1人考试参考题库及答案解析
- 2026天津市粮食储备有限公司面向社会公开招聘考试备考题库及答案解析
- 软件产品开发需求调研及分析模板
- 骨干教师培训与幼儿园管理简介【演示文档课件】
- 中学教务处日常管理规章与实施细则
- 10吨龙门吊安装质量控制
- java期末试卷(A)及答案
- (2025年)老年人慢性静脉疾病诊治中国专家共识课件
- 2025至2030中国组网专线行业调研及市场前景预测评估报告
- 2025年成都经开区龙泉驿区面向社会公开招聘医疗卫生事业单位员额人员139人备考题库及答案详解一套
- 宁夏石嘴山市惠农区第二中学2025-2026学年八年级上学期期末检测生物试卷(无答案)
- 2025内蒙古能源集团智慧运维公司运维人员社会招聘105人笔试参考题库附带答案详解(3卷)
- (零模)2026届广州市高三年级调研测试数学试卷(含答案解析)
评论
0/150
提交评论