污染识别(精选四篇)
污染识别 篇1
关键词:电石法氯碱企业,污染场地,污染物识别
电石法氯碱企业污染物排放种类多且复杂, 如何在众多污染物中识别出可能对场地土壤污染的重点污染物, 对于污染场地风险评估及污染场地治理修复工作极为关键, 首先通过判断企业各类污染物排放情况, 确定污染物对土壤污染的可能性, 结合企业生产运营期间污染事故以及环保设施运行和污染物超标排放情况, 对场地污染物进行初步识别。
1 电石法氯碱企业污染物排放情况分析
1.1 电石乙炔法生产聚氯乙烯工艺
主要包括乙炔工序、氯化氢工序、氯乙烯工序、聚合工序和干燥包装工序。
1.2 离子膜法生产烧碱工艺
是利用电解盐水来制备烧碱及氯气、氢气、盐酸的工艺。包括盐水一次精制工序、二次盐水精制、电解工序、淡盐水脱氯工序、蒸发工序、蒸发固碱工序、氯化氢合成及盐酸工序。
1.3 污染物排放情况
1.3.1 废气
(1) 乙炔工序中产生的电石加料斗置换废气、电石破碎烟尘, 一般采用袋式除尘器进行降尘后排空。 (2) 氯乙烯工序中产生的氯乙烯废气经变压吸附回收其中的氯乙烯及乙炔后排空。 (3) 聚氯乙烯聚合、干燥工艺中的废气主要为旋风除尘器吹出的干燥VCM粉尘及PVC粉尘, 通过旋风除尘器降尘后排空。 (4) 盐水精制及电解工序中排放的废气主要为氯气, 主要采用二次碱洗将尾气中的氯气大部分进行吸收后排空。 (5) 氯化氢合成高纯度盐酸过程中产生的废气主要为氯化氢气体, 采用尾气吸收塔吸收氯化氢后排空。 (6) 锅炉尾气一般均经尾气处理设施处理后排空。
一般来说, 企业的尾气均能够得到有效治理后排放, 但考虑到废气的长期累积效应, 尾气中具有危害性, 有可能对土壤造成污染的是氯气、氯化氢、氯乙烯。
1.3.2 废水
含汞废水:主要是酸洗塔产生的含汞酸洗废水和碱洗塔产生的含汞碱洗废水, 其主要含汞、VCM等污染物质, 酸洗含汞废水一般经解析后回用, 碱洗含汞废水经脱汞后也进行回用。 (1) 废触媒含汞抽洗水:VCM区域废触媒含汞抽洗水中主要含汞、COD、SS等污染物, 一般经脱汞后回用。 (2) 气体废水:浆料汽提塔产生的气体废水中主要包含VCM、BOD、SS、COD等污染物, 一般回用于乙炔发生器。 (3) 废盐水:化盐产生的废盐水一般回用于重新化盐。 (4) 螯合树脂塔再生废水:一般回用于化盐工序。 (5) 蒸发冷凝液:各类蒸发器产生的蒸发冷凝废水主要包含氢氧化钠, 一般回用于乙炔发生工序。一般来说, 企业产生的废水基本都能够进行有效利用和处理, 考虑到生产过程中有可能存在的跑冒滴漏等问题, 废水中具有危害性且有可能对土壤造成污染是含汞废水。
1.3.3 固体废物
(1) 电石渣:电石渣的主要成分为氢氧化钙、氢氧化镁、硅铁、未反应电石等, 一般有专门的电石渣堆场, 或者用于水泥生产的原料。 (2) 废硫酸:主要是硫酸洗净塔钟用于清洁乙炔气体及干燥填料的废硫酸, 废硫酸一般交由有资质的危险废物经营单位进行处理。 (3) 盐泥:化盐工序产生的盐泥含水量约50%, 主要成分为氯化钠、氯化镁, 盐泥一般经压滤脱水后送至专业渣场。 (4) 含汞废物:主要包括废触媒、含汞废活性炭、除汞器含汞废渣、含汞结晶盐, 含汞废物一般与废触媒一并交由触媒生产厂家。 (5) 废固碱:在VCM工艺过程中用于中和用的废固碱, 一般直接进行外售。 (6) 废螯合树脂:树脂塔的螯合树脂失效后一般交由有资质的危险废物经营单位进行处理。 (7) 高沸物:高沸塔产生的高沸物交由有资质的危险废物经营单位进行处理。 (8) 废离子膜:电解槽中的离子膜失效后交由有资质的危险废物经营单位进行处理。
以上所列的固体废物中, 均有合理的出路和处理方式, 考虑到固体废物在堆存过程中由于防渗措施、防逸散措施等问题, 可能存在部分固体废物污染土壤的情况, 且由于汞具有挥发性, 贮存过程中容易挥发污染汞贮存库周边土壤, 综合考虑固体废物中具有危害性且有可能对土壤造成污染是电石渣、含汞废物。
1.3.4 无组织排放
(1) 淡盐水脱氯、碱洗涤塔无组织排放氯气。 (2) 盐酸合成工段无组织排放氯化氢。 (3) 氯乙烯厂房无组织排放VCM。 (4) 乙炔发生车间无组织排放乙炔气体。 (5) 电石破碎、加料过程中无组织排放电石粉尘。 (6) 成品聚氯乙烯包装过程中无组织排放PVC粉尘。 (7) VCM装置区无组织排放汞。
化工装置生产流程中, 工艺物料全部封闭在设备和管道中, 与环境相隔绝, 物料一般不会弥散到空气中形成无组织排放。一般情况下, 压缩机、泵类、阀门及管线在运行过程中可能会产生物料的散发和泄露。综合考虑无组织排放中具有危害性且可能对土壤造成污染的是氯气、氯化氢、氯乙烯、汞、电石粉尘。
1.3.5 企业日常生产使用化学品
电石法氯碱企业日常生产运营期内主要使用的化学品有烧碱、氯气、氢气、氯化氢、盐酸、次氯酸钠、三氯化铁、硫酸、电石、乙炔、氯乙烯、氯化汞等。
一般情况, 企业日常使用的化学产品都严格管理, 不会存在泄漏而污染土壤, 只有在事故状态以及部分化学品在填料过程中的无组织排放可能会对土壤造成污染, 综合考虑化学品中具有危害性且可能对土壤造成污染的式氯气、氯化氢、氯乙烯、氯化汞、电石等。
2 污染痕迹、污染事故调查
通过第一步对电石法氯碱企业的工艺研究后, 能够初步识别部分企业对土壤污染的污染物。第二步确认企业在生产运营过程中在各个环节中有无污染事故的发生, 如有污染事故发生, 则确认该污染事故的主要污染物, 作为识别土壤污染物的重点。同时, 应着重调查企业在生产运营过程中各环保设施的运行状况, 以及污染物超标排放情况, 对于存在环保设施运行差以及存在污染物超标排放情况的污染物也应作为识别土壤污染物的重点。
3 污染物初步识别
电石法氯碱企业生产过程中产生的污染物有电石渣 (电石渣在生产过程中由于原料的区别, 难以避免会有各类重金属, 一般土壤污染主要以一类重金属为主要识别污染物) 、电石炉炉气、精馏尾气、聚合母液、聚氯乙烯干燥尾气、汞等。
原料和中间产品中有危害性的物质有氯气、氨气、烧碱、盐酸、氯乙烯、硫酸, 具有较强腐蚀性的物质是烧碱、盐酸、硫酸、氯气。
结合原材料、生产工艺及产品以及企业生产运营过程中的污染事故、排污情况分析, 初步判定电石法氯碱企业对厂区土壤有害的污染物是氯气、氯化氢、氯乙烯、汞以及原料电石中可能携带的铅、锌、镍、铬、镉、砷等一类重金属以及污染事故排放污染物和超标排放污染物。
参考文献
[1]岳占林.电石法生产聚氯乙烯行业危险废物产生规律研究.2012中国环境科学学会学术年会论文集:第三卷, 2012.
[2]史丽洁.电石法PVC生产中主要污染物的治理.全国聚氯乙烯行业技术年会论文集, 2007.
污染识别 篇2
基于DRASTIC的地下水易污染性多目标模糊模式识别模型
摘要:介绍了目前国外广泛应用的`含水层易污染性评价的DRASTIC模型,分析了该模型存在问题及产生原因,讨论了含水层易污染性及其评价中存在的模糊性,建立了多目标模糊模式识别模型,给出含水层易污染性评价大小的习惯性描述语言.分别用DRASTIC模型和多目标模糊模式识别模型对一个应用实例进行了研究,由评价结果的分析比较结果表明,多目标模糊模式识别模型比DRASTIC模型更真实地反映含水层易污染性.作 者:王国利 周惠成 杨庆 WANG Guo-li ZHOU Hui-cheng YANG Qing 作者单位:大连理工大学土木工程系,辽宁,大连,116024 期 刊:水科学进展 ISTICEIPKU Journal:ADVANCES IN WATER SCIENCE 年,卷(期):, 11(2) 分类号:X143 关键词:含水层 易污染性 多目标 模糊模式识别污染识别 篇3
关键词:ArcGIS;Modelbuilder;衰减函数;识别模型;快速有效
中图分类号: R123;S127 文献标志码: A 文章编号:1002-1302(2014)03-0312-04
随着我国村镇饮水安全问题日益突出,村镇饮用水源地的保护问题亟待解决,而污染因子识别是水源地保护工作的基础。目前,针对水源污染因子识别方法进行了很多研究,其中陈敏鹏等运用清单法计算了CODCr、总氮(TN)和总磷(TP)的产生量、排放量和排放强度,并分析其空间分布特征[1];陈仪等运用农村环境污染识别方法,识别各类型农户生产和生活过程的污染源与污染强度[2];陈海洋等通过贝叶斯推理和二维水质模型建立水体污染识别反演算模型,确定污染源强度、污染源位置以及污染泄漏时间[3];苏保林等用经过参数率定和模型验证的密云水库流域非点源SWAT模型系统,识别了非点源污染的时空变化和负荷关键区[4]。这些研究依赖于大量的现场检测数据,需要确定的参数较多,试验周期长,且未对污染因子进入水源前的自然衰减过程予以考虑。 为缩短识别周期和减少对监测数据的依赖,本研究以遥感遥测的影像和数据为基础资料[5-6],运用ArcGIS中的模型构建器“Modelbuilder”[7-11],模拟在地表环境下污染因子随时间的衰减过程,对污染因子进入饮用水源时的浓度进行识别,为相关保护区的控制和治理工作提供技术支持。
1 识别对象与依据
1.1 识别对象
村镇饮用水源地污染因子识别的对象是经过衰减后在到达水源边界前的污染因子浓度。污染因子经过沟渠、水塘和前置库等滞水区,需经过一段时间的衰减后再进入饮用水源[12-14],因此,将衰减后的污染因子浓度作为村镇饮用水源地污染因子识别的对象,将更加有效地反映污染因子对水源的污染程度。
1.2 识别依据
村镇饮用水源地污染因子识别依据即相关的评价依据,目前我国主要参照GB 3838—2002《地表水环境质量标准》[15]以及GB 5749—2006《生活饮用水卫生标准》[16],包括微生物指标、毒理指标、感官性状和一般性化学物质、放射性指标等。
2 识别方法与步骤
2.1 识别方法
利用ArcGIS将污染因子识别地区的遥感影像加载到软件中,数字化村镇饮用水源地及周边污染源所在地的地理空间要素[12],并将收集到的污染源的微生物指标、毒理指标、感官性状和一般化学物质等属性数据资料导入其中,与对应的空间数据进行关联,建立村镇饮用水源地数据库。
根据村镇饮用水源地数据库中的基础信息判断污染因子在地表流经的不同初始和边界条件,选择与之对应的污染因子浓度的衰减曲线,调用数据库中的原始数据,运用ArcGIS自带的ArcToolBox和Modelbuilder功能,将衰减曲线放入“Modelbuilder”中,经过一系列地理工具处理和计算,最终得到衰减后的污染因子浓度图层[17-18],并与识别依据中的相关指标进行比较,从而识别哪些污染因子超标。
2.2 识别步骤
2.2.1 拟合衰减函数 为反映污染因子的浓度在到达水源边界前的衰减情况,在村镇饮用水源地毗邻区水田,试验共设计3个地块,除灌溉方式不同外(试验地块1为淹水灌溉,试验地块2为间歇灌溉,试验地块3为间歇+浅蓄雨水灌溉),施肥量等其他影响作物生长的因素保持一致。每个小区规格为3 m×2 m,水稻品种为赣晚籼37号,行株距26.7 cm×233 cm,施肥水平为:纯氮135 kg/hm2,施肥方式为:基肥。采样时期为:返青期,采样频次为施肥后的连续9 d内都进行取样,采样地点为每个试验地块对应的排水水塘。由试验观察发现返青期内每次施肥后氮浓度都在2 d后达到峰值,因此从此时开始记录氮污染因子的浓度,试验数据如表1所示。
对试验地块1和试验地块2灌溉后的氮污染因子浓度变化数据进行拟合,拟合系数取平均值,得到污染因子浓度随时间推移的衰减曲线,并获得衰减曲线的拟合函数(图1)。
3.2 数据分析
将模拟值与实测的数据进行比较,结果如表4所示。
经过配对样本t检验分析可以看出实测数据与模拟数据的P值大于0.05,且t值大于零,说明2组数据间的差异性很小,认为模拟数据能够代表实测数据。
4 结论与讨论
通过试验模拟与实例验证,比较由模拟模型计算得到的污染因子衰减浓度与实测的衰减浓度,结果表明两者对于识别标准的识别结果是一致的。研究表明:(1)本识别方法基于遥感遥测影像和数据,与传统的取水样化验分析相比较,具有效率高、成本低、识别区域广等特点。(2)将影响污染因子浓度衰减的因素通过衰减函数反映,识别区域的物理、化学、生物特征要与衰减模型的构建条件一致。(3)污染因子浓度初始条件要进行调整,使其满足衰减函数常数项的要求。
在今后的应用中,应逐步完善在不同边界条件下(包括不同地形、不同植物生态环境和不同工程治理措施)污染物衰减曲线的拟合及衰减模型的构建,为村镇饮用水水源地的保护提供快捷有效的污染因子识别技术。
参考文献:
[1]陈敏鹏,陈吉宁,赖斯芸. 中国农业和农村污染的清单分析与空间特征识别[J]. 中国环境科学,2006,26(6):751-755.
[2]陈 仪,夏立江,于晓勇. 农村环境污染识别方法与应用研究[J]. 农业环境科学学报,2010,29(11):2221-2227.
[3]陈海洋,滕彦国,王金生,等. 基于Bayesian-MCMC方法的水体污染识别反问题[J]. 湖南大学学报:自然科学版,2012,39(6):74-78.
污染识别 篇4
在众多的研究[1,2,3]中,自动化的静态代码分析工具作为在开发早期检测漏洞的工具被提出,发挥了极大的作用,减少了程序员人工检查代码的时间。微软安全开发生命周期[4]也将静态代码审计工具作为软件开发中的一个重要组成部分。然而,行业研究显示静态代码分析工具在使用的过程中存在一些问题。在研究和观察中得知开发人员往往没能意识到这些安全警告,同时也没有对其进行纠正[5]。静态代码分析工具产生的报告中含有大量的警告信息使得这一问题变得更加严重[6]。本文同样发现当开发人员试图纠正一些错误的警告时,又产生了新的安全漏洞。研究表明,一些主流的静态分析工具产生的报告中只有约5%的警告是安全威胁。
少量真正有意义和大量晦涩难懂的警告信息杂糅在一起造成了开发者忽视静态检测工具产生的结果这一模糊情形。从某种角度,开发者认为这些警告不能带来麻烦或者产生真正的危害,从而认为警告信息没什么意义。本文将展示如何通过已有的静态代码检测工具进行一些限定,使得产生的结果报告更高效简洁。本文通过限定检测的对象为任何受到外部源影响的源代码,来降低产生的警告数量并且准确的定位由用户数据产生的源代码漏洞。
1 背景
虽然目前有很多关于静态代码分析技术和一些关于静态检测效果的文献,但是很少有文献研究静态分析工具是如何用于企业和会给企业带来什么样的问题。文献[6]罗列出了大量的警告,但是这些警告很难进行归类[5],因此,开发人员很难分辨出与安全相关的警告。有必要确定一个外部攻击的警告的子集,这样可以使得开发人员更容易确定哪些警告对于安全性来说是重要的。
在开发过程中,代码审计工作者很早就用各种自动化静态代码审计工具对代码进行漏洞分析,因此,不需要花费很多的精力去研究这些漏洞。但是,代码审计工作者也希望静态代码分析工具可以检测出代码中真正的安全漏洞[6],这就需要对从静态分析工具中得到的警告进行严格的审查并记录成报告。代码审计工作者可以观察到哪些警告被开发人员纠正,哪些没有被纠正,同时也清晰地发现哪些漏洞容易被忽略,哪些漏洞永远不会对其进行修正。被忽略的漏洞通常是大量相似的不会形成安全威胁的警告,因为没有用户数据利用警告进行攻击。开发人员只会将这些警告看作是锦上添花的更正信息,因为开发人员不可能进入警告信息所需要的状态。因此这类漏洞容易被忽视并且永远不会被纠正。这种忽略警告的行为最早是在一个关于审查开发人员能否正确地从静态分析工具中识别安全警告的能力的研究[5]中发现的。
从对这类文献的研究来看,在产业化开发中,对静态代码工具的使用策略以及检测报告的正确评估是很有必要的。
2 研究方法
因为开发人员经常会忽略或误解安全警告,本文需要想办法来区分那些非常可能被开发人员误认为是安全相关的标识的警告,需要将源代码分割成很多部分。这些分割后的代码可以直接或者间接地被用户数据所影响,同时代码并不能被外部非用户数据来源所影响。本文通过研究流程敏感分析、过程间分析和上下文相关的数据流分析方法解决上述问题。由于这种方法非常详细和精确,在某些情况下可以使用更简单、快速的分析方法,但是为了简单起见在本文所有的分析中都是用相同的分析方法。数据流分析通常用于编译器的优化[7]中,在这个领域中,有无数的课题和研究利用了此种方法。因为本文关注已经被分析但还没有统一化的C++和Java代码,所以本文采用了几种已知的流分析方式和程序模块化方式,而并不是用自己定义的方法去解决。
为了更好地筛选安全警告,首先,本文必须确定源代码中的数据入口点。入口点可以是任何类型的用户数据、甚至套接字、文件操作或其他的用户输入的操作。这是通过在不同的特定输入源中进行简单的词法分析来实现的。然而,仍有一些局限需要被解决。第一,对所有可能的输入源做数据流分析往往会导致大部分代码都被标记为污染代码,因此,有必要将输入源限定为特定的输入类型或者追踪那些被不同的输入源污染所影响的代码。本文通过结合这两种方法并且允许审核者决定如何处理输入源才能得到最好的结果。第二,由于面向对象的程序设计往往只有一个程序类,并且该程序类执行了由词法分析所确定的套接字操作,因此有必要继续进行分析并确定哪些代码或类使用了基础套接字类。这个操作可以创建输入源的层次结构[8],并且可以更加充分将结构展示给开发人员,以便开发人员能够确定威胁的根源。图1展示了这种层次结构。在这个例子中,输入源B和C是开发人员所关心的,而输入源A只是一个基类。
在确定了一个输入源之后,数据流分析将表明用户数据是如何通过源代码进行传播的。因为本文关心那些可以被服务软件用户所利用的漏洞,所以只需要在网络中检查输入源。一些检查器将用户数据所影响到的每一行都将被标记成被污染的代码,并对被污染的源代码进行专门的标记。比如,一个循环执行N次取决于用户输入变量的大小,然而,用户输入本身从来没有在循环内使用过。因此循环并不会直接被污染,与此同时缓冲区溢出检查器也会检查被污染的代码。
由于在面向对象的设计中,数据路径分析往往会中断和创建新的片段,分析将会从代码中原始类或对象所使用的位置开始重新启动。通过这种方式,本文可以将程序片段从开始到结束进行传递,如果数据流分析的过程中发现了已经被污染的代码有相同的上下文内容,它将会终止分析跟踪,以节省分析所消耗的时间。
最终的结果将是一个包含被污染的和未被污染的源代码树,以及带有可能污染路径的层次结构输入源。
由于Coverity[9]工具是一个商业化的非开源的源码工具,不能对其代码进行修改来分析被污染的代码。不过本文可以对Coverity工具分析的结果和污染源代码进行比较,如果一个警告存在于被污染的代码部分,可以根据它们的输入源进行组合,忽略未被污染的源代码中产生的警告。
本文可以改变Findbugs[10]工具的源代码,用此工具对被污染的源代码进行数据流分析。为了确保所有的被需要的代码都包括其中,还必须要加入变量初始化和其他的一些代码以保证分析不会失败。本文只对被污染的代码进行一个标准的Findbugs工具分析,来减少Findbugs工具分析时所必须检查的行数。
3 研究结果
3.1 Coverity工具的分析
Coverity工具审计了两个工程和一个类库。本文的关注点是在远程安全漏洞上,因此忽略了本地输入污染的影响。事实上,输入污点分析的使用要求检查器是特定的输入或者大部分将被标记为污染的源代码。在表1和表2中,警告的数量和被输入数据所污染的代码百分比被分布到不同的输入源中。通过比较代码的行和警告的数目,推测出该代码的差异。在大多数情况下,存在一个第一次创建的套接字类,然后其他的类使用这个基础的套接字类来处理不同的协议。在这些情况下创建的初始的套接字类并未考虑到入口点,而是考虑使用基础套接字类的协议。这样做的目的是增强用户的可读性,而是采用了何种协议或命令来启动污点来作为重要的入口点而不是套接字类。在工程A中,头两个输入源对它们的数据进行的遍历非常相似,得到的大多数的代码和所有的警告都是相同的。然而,从工具中得到的报告警告的数量降到了只有总警告数的18%,明显减少了来自开发人员的负担。第三个输入源是一个新的协议,与其他的输入源之间存在着很小的交互作用。尽管如此,结合用户输入的所有三个来源,得到报告中的警告在1600个警告总数中占24%这个结果。从这个改进的报表中可以得出21%的漏洞是先前的研究中就被发现的,而剩余的则是通过非安全检查器发现的漏洞。
工程B明显降低了警告的数目,使得开发者有意愿对每个警告进行检查,而这些警告有可能危及产品的安全性或稳定性。但是与工程A进行对比,工程B的每行代码同样有较低数量的警告产生。由于污点分析,本文确保那些被忽略的警告并不是可利用的安全警告,因此,提高了静态代码分析工具的准确性。
3.2 改进的Findbugs工具
对一个类库进行分析,是比分析一个工程更加困难的工作。如果整个API类库被认定为一个输入源[11],3.1节中方法将不再可用。通过限制其只对网络类进行污点分析仍然会检测大量代码并报出大量警告来,这就表明了对非服务器源代码使用输入污点分析是有限制性的。除了考虑到对API库进行处理时有限制性外,在进行文件操作和数据库的处理时,同样有相当大的问题。这主要取决于当这两个操作被执行时会丢失信息。数据流分析将会在数据库进行写操作时结束,不会再继续进行分析[12]。但是,用户数据却可以被阅读并且在代码的不同部分中使用。如果在数据库的读操作进行一轮新的污点分析,那么将会有大部分的代码会包括在其中,不会达到预期的效果。因此本文需要对数据库的使用执行更加智能化的分析。Java静态代码分析工具Findbugs并不像Coverity工具一样有大量的安全检查器。因此,当本文使用Find Bugs工具对代码进行检查分析的时候出现的安全相关警告的数量会比Coverity低。这主要是因为Java语言更加安全和Find Bugs静态代码分析工具更加成熟。
与C/C++产品相比,Java产品只有少量的警告产生[13]。因为Java产品并未对用户数据执行任何繁重的计算,这种设计也意味着会有较少的代码受到用户输入的直接影响。这样产生的少量的警告,使得审计者可以更加容易的对其进行核查。对于工程D来说,两个输入源尽管有着不同的代码路径,却有着基本完全相同的警告。经过其数据流分析之后,工程E就只产生了先前2%的警告。
3.3 灰盒静态代码审计工具
最后,本文设计了一个新的静态代码审计工具,这个工具主要针对跨站点脚本攻击(XSS)漏洞的识别。通过确定用户输入源和反馈给用户的数据之间是否有数据流,就可以查找XSS漏洞。表2中只有工程D可能遭受到XSS漏洞的攻击,Findbugs工具并不会对单一的XSS漏洞作出报告,而此静态代码审计工具检测到了7个可能的XSS攻击威胁,所有被发现的漏洞在代码中都被利用进行攻击。由于在审查代码时,首先进行了输入验证,因此在最终产品中并不存在被攻击的情况。此代码审计工具同样对反射型XSS攻击的检测做了限制,反射型XSS通常会在一个错误的页面产生。而存储型XSS首先将数据保存到一个储存设施中,在将其发送给用户之前先对数据进行重新检索。由于本文将从数据库的检索中得到的用户输入信息的污点设置为安全,因此代码审计工具不会对数据库的读操作做任何的污点分析。在结果中,存储型XSS漏洞不会被报告出来,这样的分析是建立在准确度和少量警告以及误报之间的博弈。
限制静态代码审计工具来报告所有代码中可能的错误看上去好像很奇怪,然而,如果一个开发团队处在一个轻量级的开发上,大量的警告并不会在每一个版本发布出来前被尽数更正。事实上,这样一来静态代码审计产生的结果很难在项目开发中占有一个较高优先级的位置。对于静态代码审计工具来说,能将那些可以被认定为是安全威胁的警告与那些不可以被认定为是安全威胁的警告区分开来是非常重要的事情。不管是执行静态分析前还是进行分析后,都可以通过执行污点分析的方法将安全漏洞从其他的漏洞中区分出来。当使用Coverity工具时,工程A出现的警告数超过了1600个。如果假设每检查一个警告平均耗时3分钟,那么,对所有的这些警告进行审查将要需要80个小时。在轻量级产品开发中,这是一个非常耗时并且不实用的开发。当使用3种不同的网络协议对其进行处理后,确实将警告的总数量降到了24%。
面对一个少量一个大量的两份报告,开发人员一般都会忽略掉数量大的报告,而选择数量少的报告。相反地,根据不同的污染输入源对这些警告进行分组处理。通过流分析方式,开发人员可以将注意力主要放在那些存在较高概率报告出漏洞的警告上面。通过了解错误是如何进入源代码中的这一问题,对警告进行审查的工作也变得比较简单。
本文集中对数据流分析的耗时进行了研究,包括流程敏感分析、过程间分析和上下文相关的数据流分析。但是,对源代码进行的处理也应该可以使用较少耗时的算法,事后,再用较多的时间对输入源标记的特殊的警告进行验证研究。由于Coverity分析过程往往会消耗多个小时,因此消耗额外的几分钟对数据流进行分析并不影响分析的结果。相对于Findbugs工具的分析,Java源代码量比较小,整个分析过程会在几秒钟完成,并且数据流分析也主要集中在对网络输入进行处理的少量代码上。而为了对数据库进行处理,需要传输更多的信息,因此污点分析变得更加的复杂。为了降低复杂性,可以主要研究软件的设计。如果本文没办法对数据库的输入进行区分,那么整个数据库读取流程将被认定为是污染点。在这种情况下,污点分析可能将会对源代码中的大量的代码考虑使用别的分析方式,但是,如果能很好地区分,那么污点分析可以继续执行并且可以获得比较好的结果。
4 结语
本文展示了静态代码分析过程中只对可能被外部用户数据所影响的警告进行过滤分析的益处。通过执行数据流分析和只报告或者分析这些特定的源代码,开发人员可以了解威胁的来源以获取更多漏洞的信息。并且对那些有较高概率被标记为漏洞警告的优先级的确定和审查也比较容易识别,这主要是因为将那些不受来源影响的警告和受到安全来源影响的警告进行了区分。分析可得,如果只对被污染的源代码进行分析,如降低四分之一被分析的代码(未受污染的代码)数量,就可以减少分析所消耗的时间,得出的警告的数量减少到了总数量的五分之一,漏洞的数量从5%增加到了将近25%。这样减少了开发人员所必须审查的无用的警告的数量,从而提高了静态代码审核工具的准确性,为开发人员节省了审计漏洞的时间。
从开发人员对产生威胁的数据源和小型报告感兴趣的情况来看,本文对警告进行优先级划分的方法将使得开发者在快速开发周期中获益,而在这样的周期中开发者恰恰难以保证所有的警告都得到更正。
摘要:由于静态代码审计工具具有自动化、不容易出错的特点,开发人员经常使用它来检测代码漏洞,但是检测出的代码漏洞的结果会产生大量的警告信息,开发人员必须手动进行检查和纠正。此工具的缺点是浪费开发人员大量的时间。通过对用户的输入以及敏感数据流的追踪来确定警告的缺陷是否真的被利用,从而减少静态检测工具产生的大量警告数量。同时提供给开发者更多真正能对软件产生威胁的警告信息。针对静态代码审计工具的缺点,研究三种不同的方法来提高静态代码审计工具的性能。第一,对于商业性的静态代码分析工具Coverity,重新分析它的结果,并且从安全的角度创建一组具体的相关警告。第二,对开放的源代码分析工具Findbugs进行修改,并只对被用户输入所污染的代码进行分析。第三,研发灰盒代码审计工具,此工具侧重于Java代码中的跨站脚本攻击XSS(Cross Site Scripting),使用数据流分析的方法来确定漏洞的切入点。实验结果证明工程B使警告数量降低了20%,工程E只产生了2%的警告,降低了工具产生警告的数量,为开发人员提供更多的信息来区分此警告是否是真正的安全威胁。