cc/C* 安全编码标准 开发安全、可靠、穐固系统 的98条规则 . THECCEoRmT:NCG TheCERTCCodingStandard 98RulesforDevelopingSafe,Reliable, andSecureSystems(secondEdition) /T)C机hi槭na工Ma亚chi出ne版Pre社ss 图书在版编目(CIP)数据 (CS安ea全co编rd码,R标.准C:JB幵;发挑安军全等,*BT.-K.dt京固:系机统的工业98出条版规社则,(2原01书5.7第2版)/(英)西科德 (书C名/C两+文+:技T术h丛e书CE)RTCCodineStandard:98RulesforDevelopingSafe.Reliable, andSecureSystems,SecondEdition ISBN978-7-U1-50902-0 I.C…II.①西…②眺…IH.CS&-程序设ItIV.TP312 中团te本图书mCIP数据核字(2015)第172083号 mfp本fuvebf书aalAAni/ssl板uhol,ierrb权ediDofllebtsrhrciyittitsleroPadoprcnel号iitsitrrgce9a:rSonvoonserBfldEta.mt-d字MiuosNcenl:ooahtbafiporonl*aonl.irmc..tta-aInoln2t,fdehHSieInhttCciBa*lornuptbgdySoliirynotithksguhrpmlntahsOano_ygl2oub0cae1og4per.cyeplBndrJ«oiMtd.iMournce)e,.cdo9er7nod8lril0nlIl3ger2ad1no9srTm8hb4eiyi0Ci4s«Ed3nRyibTnyCi«nRnCfooyorbdmfeionrartglmlCSo.tnooSnrsdeibcaoyrerdoa:agnVey.' 包P«格M中本!书CSo中&p文yWri■Mgh汰Rt和字©20由中15P.«觸ap*rsnonn门isEdu期ca行tionp0u(0«bl生ish家tetWd出(》b出y发P行a,ar*sognInaBc.»du#ca书lioans^出Asssriaa.不L在td*中,以,a任人ndR方C«式hi«n抄ataMwa内c(hMi不nWe 5有PearsonEdocatioA(培生ffrff出Ka) 賊签.无孩者不*w*. C安全编码标准 开发安全、可靠、稳固系统的98条规则(原书第2版) 4印出R开n5f板任lW发蝙a号行本辑W:::::(-Cm00关北(1I«1TJS8O0IBRW6M敏)>Nm:rH86Dnm889.Us337*!xu出M7289Ha-2ff42彩47i9、204-8色Hm1印1fmBBf1lBB明.-335由671有190/(*106986468t公69t万2a-司m600f9fSl9B大5*2M5292q*M定费B*U*B任Sm(*S校t1)f张次价8>t对::1:::I0(h00z22董[email protected])50)hS50*SS年bf元l;o4o87k9月c6o0*4m1版第1次印助 ft校必究 封在无坊A孩均北为BLK寧务所《«/SR东 - /4( 译者序 . 历败各种编程语苜 可能很难有一种能够达到C语吉的高度。凭借良好的移椬性和跨 平台支持,以及高效率的低级处理能力,C语言成为现代最流行搡作系统平台的基石,也 成为教育、研究和软件开发中最受人欢迎的语言之一。 C语茛灵活的类撖转换和貼近底层机器实现、自标代码效串高的特性,一直是系统软 件开发人员最为S爱的,但这也是一把双刃剑。随着软件系统的复杂度不断.提商,编码中 的一些小明疵越来越容易暴S出来,从而引发严重的安全问通,加之UNIX Windows等主 滚搡作系统的各种组件大多以C语肓编写,黑客们乐此不疲地寻找着这些方面的漏洞,这 绐全球的计算机系疣安全带来了严S的威胁。 . 在这种形势下,制定一种严格的安全编码标准,避免出现可利用的安全灞5H M成 为1T业界的当务之急。许多大型开发团体都制定了自己的安全编码标准,国际标准化 组织也对C语宵标准进行了修订,对C语g实现提出更严格的要求,从而为安全编码提 供了基础。 本编码标准是业界采纳最广泛的编程指导原則汇编.它紧扣各个版本的C语言标准, 分门别类地介绍了备种可能引发可利用安《全 洞的未定义行为、未指定行为,提出了安全 编码的规则和建议,在每条规则和建议上都用现实的相容及不相容代码示例加以说明。本 书是该标准文档的第2版,加人了对最新的C11标准的支持,对所有有志于C语言软件开 发的技术人员来说,本书都是不可或峽的.参考书。 中处可.能,本确书造书实成中内有严的容许f例i极问多子其埋似和丰是的说富而不明非,当文正的编宇如东程,作西就方,者是法也。所要许言揭在只开翻有即层译在便层过细是迷程细雾中C咀我,语麟们言帮书也助M中际深读代标有者码准体认片中会识段很,.之多书也后存并中.在不引才着那用能许么的逐多明标步棋显准1J糊但条消之是文。 _ IV 我们力求再现原书所要阐述的基本原理,希望能够真正地帮助到读者,但因水平所限,错 误在所难免,期待广大读者批评指正。 本书的翻译工作主要由姚军充成,徐锋、陈志勇、谢志雄、方翊、白龙、林耀成、陈 、宁K、吴玥等也对翻译工作做出了贡在此衷心感谢机械工业出版社华章公司的关 敏辑和其他编审人员做出的辛勤努力。 本书为C语言编码提供了规则。这些规则的目标是开发安全.可*和稳固的系统.例 如,消除珥能导致程序意外行为和可利用漏洞的未定义行为。遵循本标准定义的编码规则 是确保C语言开发的软件系统安全、可靠,稳固的必要条件(但不是充分条件)。安全和 求稳所固有的内设存计都也是是胂必态要分的配,的安。全然性而关,键应系用统本通编常码会标提准出将比产编生码高标质准世更的严系格统的.要这求些,系例统如可,靠要、 健壮并且能够抵御攻击。 每条规则都由一个标 、一段说明和不相容/相容的代W示例组成。标题是规则的简洁 描述,但是有时候不够稍确。说明提出了规则的规抱要求。不相容代码示例是违反规则的 代码示例。搭配的相容解决方案朗示了等价的代码,这些代码不违反该规则或者该编码标 准中的任何其他规则。 具有良好文档、可以实施的缟码标准是C语宮编码必不可少的要索。编码标准歧励程 序—员遵循由项日霈求和组织确定的一组统一规则,而不是简单地采用程序员熟悉的方法。 旦碗定,这些标准钉以作为评估級代科(使用人工或者自动化过程)的指标。 会议C上ER宜T布编在码其规产则品为开业发界中广采泛用采C纳E。RTCCisc安o系全统编公码司标在准作20为11基年准10编月程的标C准is。co最年近度.SOecrCacolne 将所有CERT安全编码标准整合到现有的安全编码标准中。注意,这是长期协作中的最新步 (AddCisEoRn-TW和esOlerya,cle20以11前)合0作绢写了<TheCERTOracleSecureCodingStandardforJava>9 范围 e本书本是衫为中如文下(标J«准v»中安定全«义«的»C*语>巳言由版机本业开出发板的杜:引进出 ISBN,97S-7-IIM28H-3.—編 耩注 VI □1SO/1EC9899:2011,ProgrammingLanguages-C.ThirdEdition[ISO/IEC9899:2011] □ISO/IEC9899:20I1/Cor.l:2012,TechnicalC-orrigendum1 本书tt第1版的基础进行更新或替换(AddisonWesley,2008)o本书笫I版的范围是 C99(C语言标准第2版)[ISO/IEC9899:1999)e虽然本书中的规則是为C1I开发的,但是 它们也适用于C编程语言的较早版本(包括C99)。在C语苜标准各版本之间的差异影吶这 些规則的正常应用时,本书将在合适的地方进行标注。 兼准容范大围PO部内S分I(cid:127)X但规和是则W都.in有编do一码w个问s操不魉作相的系容最统代佳的码解相示决应例方.解程案决序往方与往案与C。U平以兼台1容相SO,关/以I(cid:127)EC确在技保许-术规多报则悄告所况或识下者别,技的本术间标规f准i范提在形供标 式发布的语言和程序库扩展常常优先使用例如ISO/IECTR2473-12(ExtensionstotheC Library-PartII:DynamicAllocalionFunctions)[ISO/IECTR247312:2010]插述的扩展。在 许多悄况下,还有为Linux或者OpenBSD等平台提供的兼容解决方案。我们偶尔还会描述 有趣或#宜现的特定实现行为。 im C语言编码标准专注于C语言样*(C11)和C11之后的相关技术报告,可以《在 长的 时期内创造最商的价诅。 测为试人C.知语才或言能者标包在准含现尽在有可标方能准法记中无录。能现本为有书力的有时实不使践同用方的B法的新。:方也确法就。定是一换说组一,f种t太佳说部实法分践.功,本能有书必时试须候困先霑推在要动某介变个绍化实尚,现未而中广不 只是记录_它们 口),例对如它,的C支II持中正引在人日了益可增选加而,规但范是的目附前件只K有u少B数ou供nd应s-商Ch实cc壤lcin了g这In一ter接fac口es。M该(接边口界检引査人接了 m«mcpy.s()等函数,目的是为API添加目标缓冲区大小,提供安全性服务。这一文档具有 前贍性没有道理仅因为这些函数没有广泛实现而忽略它们。基本C语a标准的实现比附 件K更广泛,尽苷附件K还没有广泛实现,但它是行业发展的方向。新型C语言代码的开 发人员尤其需5这样一本指南,指导他们使用正在开发的编译器和工具,从而最大限度地 利用其能力。 有些供应商对C进行了扩展,有些则只实现了C浯言标准的一部分便停止开发。因此, 不线可.能声倒称退某回个去编仅课讨器论具体C9支9、持C某95个或标者准C。9不0。管供选应择商哪的个支分持隔方点程.非不常同复的杂编,译无器法对确于定该一语条基言 的不同部分都可.能出现相反的结果。要支持所有可能性,就必須对每个产品测试语言的毎 个特性c因此我们选择了最近的一个分隔点,使标准定义的规則适用时间尽可能长。由 vn 是于支C持语的言种绢类程不固同有,的当安全程性序员/可只移使椬用性C之99间规的定权的衡功。能时,源代码的可移椬性得到加强。这 前W性信息的价值随着时间的推移而提高,之后开始下降。而回猢性信息的价倌从一 开始躭立刻下降》 由于以上这些原因,本书首先支持使用尚未加人C语言标准的C11及C11之后的技术 做报的吿在目进效的行果的不新是显代捕著码捉且开所不发有会。伯影其离响次C其支语他持言优对标先准C亊9的项9旧情的代况时码.候及而.技是本术捕书报捉将吿少为的败支纠几持正种旧。ff编i要译的器情做况出。贡献。这样 没有解决的问题 对于一些间 ,本书没有提供解决方案。 . 编码风格:编码风格是一个主观的问题,实践证明 无法开发公认的正确风格指南。 因此,本标准对于具体采用*一种风格不作要求,只建议开发组织定义或者采用风格指南, 并一致地应用这些方针。一致地应用某种编码风格的ft简方法是使用代码格式化工ft。许 多交互式开发环境(InteractiveDevelopmentEovironmeol,IDE)都提供这种功能。 有争议的规则:一般来说,CERT缟码标准试图避免包含呋乏广泛共识的争议规则。 本书的读者 . . 本书主要是为C语言程序开发人员而编写的 但是也可以供软件采购者使用以定义 定制软件的撕求。本书特别有利于对构造可靠、健壮、可以抵御攻击的质量系统感兴趣 的程序员。 序的本书夫虽部然不分是运专承门针中对也C*H存程在序.员不的垃,在但许是多对悄他况们下仍.然两有者一的定解的决价方值案,不因同为。csw程 历史 S但C其22C受AEV众RGT主1安4要)全是在编编德码译国标器柏准实林的现召思者开路,的起而2诼0且0于6,春C许季语多会言人议标注【准意S委e到ac员o.r会d它(2的0更1语3正a言】。式棋的C蝴语叫.宮法往标是往准I很S是O费/权I解E威C。文JT安档C全1./ 编码标准主要针对C语言程序员,为使用该语言安全绾码提供实用指南。 . CERTC安全编码标准在CERT安全编码wikiOmp://www.securecoding.ceri.org)上 按照基于社区的开发过程开发。来自该社区的专家(包括WG14C语言标准委员会成员)应 VIII 遨准投和搞中,独并的且规得则到做出Wi评ki论的。编提辑供特商权。质世社区评成论员的可审以核在者常Wi常ki得上到注编册辑一特个权免《.费可以号直,接对为雄编码标码 标胙基的于开社发区和发的展开做发出过贡程献有。许目多前好,处C。ER最T诳安耍全的编是码.w它ik广i有泛1吸57引6专名家注册,并的1让S献他者们。对規Wd的 内要容圾形新成信一息致,的15意见接。受在W未wi全ki面上核开査发的安变全化编.码那标么准这的种主不要稳缺定点性是是内可容以不接断演受化的。B如然而果你,箔许 多软件开发组织想要一组静态的规则和達议,以便作为软件开发过程的需求,为此,在社 区1.0开版发本两和年安半全之编后码,标我准们的出w版iki丫版本本书幵第始丨分版道。《扬随。着2008年6月该书手稿的制作■书格的 在2007年4月的伦敦会议上首次提交CERTC安全编码指南给WG14审核,2007年8 在月该成将在根为夏CE据成PRL报臾T2道2珥C.l安,纳l2全的C0编0语会8码议言年标上编4苒准程月次提任1审5交务日核给组。召.W开这GI的个4.川技作/术U为委.S.2员T类会A或G是若会〖S议3O类讨/IE技论C术了JT报ICN告1C候SlTC选S2P2的/LW问22Gf.1fii4l。的是JI美否1国应现 (技有术时颗间问)小有组4。人我,们反就对者(谁没有有时时间间承)担有这一12项人目3"之这后个.问我题们进接行收了到一的次反民馈意是测,验虽,然赞C成ER#T C安全编码标准是一组强大的指异方针,开发吋得到了WGI4的许多技术专家的意见,并 且己经由WGM审核多次,但是WGI4通常不负资将指南"賜予"程序员,而负贵定义编 泽器等工具的规范箱求^ . 了解了这一点之后,我们提议WGI4建立一个研究小组 考虑为C语言制作可分析安 全纗码指南的问题。这个研究小组于2009年KI月27日笫一次召开会议,CERT向ISO/ IEC贡献了C安全编码規M的一个可自动实施子集,用于标准化进程。 研究小组的参与者包括分析程序供应商(如Coverity、FortifyGammaTeebGimpel, KJoework和LDRA)、安—全性专家、语言专家和消费者。2012年3月,WG14批准开发和 c编I发家Sat0码表分a/loI委规IEgSu员C则0eT/_会》IdSEe在[Ct1IaS7TiWlO9.S6hG/1t:1rI1aE742?9Cc0的6s1T1n代3Su(m表1bE7eC9)Rr6(-o语16b:倍21e言r01t息31o编43B技】码)a正术g订规n式——购a则r发a。的后表编新来,程工加可语作人以言项了在、BW环I,SGO境研14商和究编店系小辑(统组委h工软员ttp作件:会//结接。w2w束口0w1。——.3is意年o.o大C1rg1利安/月is国全o,/ ISO/IECTS17961C语言安全编码规则 IS0/IECTS17961的目的是建立一组分析程序(包括静态分析工具和C语言编译器)的 _ rx 需求基准.供希钥诊断超出语言标准笛求的不安全代码的供应商应用。所有规则都可以通 安过全静编态码分箱析《误实.不。会选产择生这过些*规的則假的阳标性准。是,实施这些规则的分析程序必须.能够冇效地发现 目前,不同供应商巳经以特殊的方式将静态分析应用到安全保障上 造成$要安全保 规则的@的违背af悄t况面不.作统为一规pI范SO相/I容EC性T的S柑17标96,1列这準些了规则安能全够编以码实规现则相,关的要分方析式引进擎行诊扩断展这,些为 任何I相S0容/1fEtC态T分S析17实96现1的指客定户了提C供语最言小中覆安盖全保编证码》的规则,包含每条规則的代码示例。不相 容的代码示例阐述了具有潜在可利用安全性弱点的语言结构:这些例子預计会引起相容分 析程序对受影响的语言结构的诊断。相容的例子预计不会引起诊断。ISO/IECTSH96I不 指定实施-这些规则的机制和任何特殊的编码风格。 表P1展示了ISO/IECTS17961与其他标准和方针的关联性。在已有的出版物中, ISO/IECTS1796J是唯一以分-析程序而非开发人员为宜接受众的。 aw休堆 Citi,W标表癢P1I安S全O/保旧aC标TS17961安与全性其标他携标准的比较际化 CWE 无全部 •乐 否 MISBAC2 C89 否 * 否 M1SRAC3 C99 否 ft 否 否 CERTC99 C99 是 • fk ISO/CIEECRTTCSllIAr CCllII ft 否& 否ft fk 行一在次隔诊离断。检测如出果违程反序规文则本的同情时况违时反,多相条容规的则分.析相程容序的必分须析能程眵序为可技以术进规行范聚中合每诊条断规.但则是进 必須至少进行一次诊断。诊断消息珂以,采用如下形式: Sftabc访H释款的内存,文件xyz.c,行nnnu ISO/IECTS1796)不要求分析程序为任何违反语法规則或者C语言标准规定约朿的内 以容及生对成它诊们断的消W息用》不相在容这性些的规定则义的仅范针围对内分。析程序可见的脒代码。仅使用二进制码的程序库 这个技术规范的一个有趣特征是可移椬性假设(cid:127)在小组中这被称作旧金山规則",R 为这一假设是Coverity在其总部举行的一次会议中发展而来的。旧金山规则规定,相容的 分析程序必须能够诊断至少一个C语咨实现中对指导方针的违反,但是如果违反规则的结 采tt的己差经异记使录得在分目析标程实序现可的以文生档成中和,可且移不会导性致问安题全有性关缺的陷诊断,。就没例如有.必要下加列以程序诊片断。段可实以现进放