二基于源码分析的安全测试方法资料_第1页
二基于源码分析的安全测试方法资料_第2页
二基于源码分析的安全测试方法资料_第3页
二基于源码分析的安全测试方法资料_第4页
二基于源码分析的安全测试方法资料_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、二、基于源码分析的安全测试方法提纲2.1静态分析、测试概述2.2代码安全漏洞2.3静态安全分析一般性方法2.4基于形式化的方法2.5一种基于安全规则的方法2.6一种静态、动态相结合的方法2.1静态分析、测试概述定义:程序静态分析是在不执行程序的情况下对其进行分析的技术,简称为静态分析。对比:程序动态分析:需要实际执行程序 程序理解:静态分析这一术语一般用来形容自动化工具的分析,而人工分析则往往叫做程序理解用途:程序翻译/编译 (编译器),程序优化重构,软件缺陷检测等 过程:大多数情况下,静态分析的输入都是源程序代码或者中间码(如Java bytecode),只有极少数情况会使用目标代码;以特定

2、形式输出分析结果静态分析、测试概述对象各种与软件相关的有必要进行测试的产物,例如各类文档、源代码等方法评审对软件元素或项目状态进行评估的活动,用以确定与预期结果之间的偏差和相应的改进意见通常由人来执行静态分析被测程序进行特性分析的一些方法的总称 通常需要工具辅助静态分析、测试特点静态测试不必动态的执行程序,也就是不必进行测试用例设计和结果判读等工作;静态测试可以由人手工方式进行,充分发挥人的优势,行之有效。解铃还须系铃人,由于人的思维及交流障碍而造成的逻辑错误,有人通过逻辑思维去解决,是一种非常有效的方法;特别是在充分利用人思维互补的情形,检验出错误的水平非常高。静态测试实施不需要特别条件,容

3、易开展为什么需要静态测试识别缺陷的成效 静态测试的成效:最多识别软件所有缺陷中70-75%的缺陷 动态测试的成效:最多识别软件所有缺陷中30-35%的缺陷识别缺陷的成本 需求阶段识别一个重要缺陷平均花费2-3小时;设计阶段识别一个重要缺陷平均花费3-4小时;代码评审阶段识别一个重要缺陷3-5小时;动态测试识别一个重要缺陷平均花费15-25小时 为什么需要静态测试解决缺陷的成本 需求及设计阶段消除一个重要缺陷花费5-10小时代码评审阶段消除一个重要缺陷花费5-15小时动态测试识别消除一个重要缺陷平均花费30-80小时投入回报比较(实例)航天飞机搭乘项目:在设计或代码评审时消除一个缺陷的成本为1美

4、元,在系统测试时为13美元,交付使用后为92美元(Paulk etal,1995电信公司审查时发现和纠正一个缺陷的平均费用为200美元,客户验收测试发现的缺陷平均花费4200美元(Boehm and Basili 2001)印度Infosys公司经验表明:在代码审查上多花费一天,这个产品就有期望在后期修改缺陷节省3-6天静态测试主要内容主要由人工进行代码审查(Code Inspection)代码走查(Walkthrough)桌面检查技术评审广义的理解,还包括软件需求分析和设计阶段的技术评审主要由工具自动进行的静态分析代码审查和代码走查由若干程序员与测试员组成一个小组,集体阅读并讨论程序,或者用

5、“脑”执行并检查程序的过程分两步完成预先作一定的准备工作然后举行会议进行讨论会议的主题是发现错误而不是纠正错误桌面检查程序员阅读自己所编的程序缺点:第一,由于心理上的原因,容易对自己的程序的偏爱,没有发现错误的欲望(这和已经知道了程序错了读程序找错误所在极为不同)第二,由于人的思维定势,有些习惯性的错误自己不易发现第三,如果根本对功能理解错了,自己不易纠正所以这种方法效率不高,可作为个人自我检查程序中明显的疏漏或笔误代码审查和代码走查的优点不仅比桌面检查优越得多,而且与动态测试的方法相比也有很多优点第一,使用这种方法测试,一旦发现错误,就知道错误的性质和位置,因而调试所花费的代价低第二,使用这

6、种方法一次能揭示一批错误,而不是一次只揭示一个错误如果使用动态测试,通常仅揭示错误的征兆程序不终止运行,而对错误的性质和位置还得逐个查找代码审查和代码走查的效果经验表明,使用这种方法能够优先的发现 3070的逻辑设计和编码错误IBM使用代码审查方法表明,错误的检测效率高达全部查出错误的80Myers的研究发现代码审查和代码走查平均查出全部错误的30代码审查、代码走查与动态测试相互补充研究表明使用代码审查和代码走查发现某类错误比用动态测试更有效,而对另一类错误情况可能正好相反由此可见代码审查和代码走查方法与使用动态测试是相互补充的,缺少任何一种方法都会使错误的检测率降低技术评审综合运用走查和审查

7、技术,逐页、逐节地检查软件开发前期需求分析和设计的文档,对软件的需求,设计结构等方面提出问题评审也被当作一种管理工具,经过评审不仅可以提高各阶段软件产品的质量,还可以收集到一些有关该软件产品质量的数据技术评审属于广义的测试范畴,也是一种质量保证手段软件开发过程中每个阶段的评审都必须十分正规的、严格的加以定义,并根据规程实施2.2代码安全漏洞数值泄露返回值泄露Static方法中数组泄露对象变量合并垃圾回收器访问权限有关域的相关问题JAVA语言安全漏洞未验证的输入系统函数暴露系统资源暴露数据库信息暴露用户信息修改注入其他系统函数暴露JAVA语言安全漏洞滥用API模式不正确的对象比较不正确的fina

8、lize()方法不安全的DNS查询未检查返回值JAVA语言安全漏洞安全特性缺陷模式硬编码密码问题空字符串用作密码问题明码字符串作为密码的问题不安全的随机数问题未正确处理私密信息问题明码字符串作为密码的问题JAVA语言安全漏洞竞争条件模式非原子文件操作线程间的数据泄露非原子文件操作线程间的数据泄露JAVA语言安全漏洞不合理的异常处理模式异常死锁问题异常反馈信息泄露JAVA语言安全漏洞低质量代码模式Web应用程序中的main方法问题临时文件删除问题JAVA语言安全漏洞封装不当模式返回值泄露方法权限设置内部类系统信息暴露垃圾回收器protected OR publicC/C+语言安全漏洞未验证的输入

9、缓冲区溢出LDAP攻击(轻量目录访问协议)SQL注入攻击未验证的输入用于系统级别函数拒绝服务诱骗安全风险C/C+语言安全漏洞滥用API模式不恰当的chroot()系统调用未清除堆的内存释放不安全的DNS查询Socket绑定问题命名管道的脆弱性C/C+语言安全漏洞安全特性缺陷模式不可靠的进程创建使用不可靠的宏使用不可靠的注册不可靠的密码不安全的随机数不安全的权限提升忽略检查函数的返回值C/C+语言安全漏洞竞争条件模式时间检查与时间使用产生的竞争条件信号量处理不当状态同步故障C/C+语言安全漏洞低质量代码模式可预测的临时文件名暴露绝对路径堆栈变量地址返回重复释放释放资源使用变量未初始化符号数与无符

10、号数转换C/C+语言安全漏洞封装不当模式系统资源泄露没有捕获异常堆栈变量地址返回重复释放释放资源使用变量未初始化符号数与无符号数转换2.3静态安全分析一般性方法(基于工具)建模词法分析语法分析语义分析跟踪控制流跟踪数据流建模词法分析语法分析语义分析跟踪控制流跟踪数据流分析方法过程内分析符号执行程序切片抽象解释模型检验过程间分析函数调用分析安全缺陷模型故障模型内存泄露空指针故障数组越界故障使用未初始化变量的故障安全缺陷模型安全漏洞模型缓冲区溢出模型被感染数据漏洞模型竞争条件漏洞模型风险操作模型随机数漏洞模型安全缺陷模型差性能模型空字符串比较拷贝字符串未声明为static的内部类参数为常数的数学方

11、法未声明的变量及方法安全缺陷模型并发故障模型死锁代码国际化模型不良习惯模型垃圾回收、命名、方法调用、对象序列化易诱骗代码模型歧义、无意义的比较、声明未使用、永真的判断缺陷模式匹配事先收集足够多的共性缺陷模式用户仅输入待检测代码就可以与”类型化”方法关系密切比较实用容易产生“误报”缺陷查找工具准确?漏报(False Negative, not Complete)误报(False Positive, not Sound)缺陷知识哪里来程序自带工具提供基本方法基于形式化基于缺陷模式基于缺陷模式的主要工具Jlint 主要采用数据流分析技术,速度快 没有误报FindBugs 内置较多的缺陷模式 有较好的

12、应用(google)PMD 格式为主,可以灵活增加新缺陷模式 以抽象语法树为基础建立 Coverify 主要针对操作系统2.4基于形式化的软件分析方法形式化软件分析是一种基于数学的“自动化”技术:给出一个特定行为的精确描述,该技术可以“准确地”对软件的语义进行推理主要的形式化方法包括:模型检测(Model Checking)抽象解释(Abstract Interpretation)定理证明(Theorem Proving)符号执行(Symbolic Execution)基于“有限状态自动机”理论待验证系统的数学模型(FSM)描述规范的形式语言(CTL、LTL)确定数学模型是否满足规范的方法从代

13、码中抽取有限状态转换系统模型,用来表示目标系统的行为适合检验“并发”等时序方面的特性对于值域等类型的分析比较困难状态爆炸SPIN,BLAST,SLAM。模型检测抽象解释一种基于“格”理论的框架许多形式化分析方法都可以被涵盖其中主要适合 数据流分析(Data Flow Analysis)尤其是对循环、递归等主要思想是对代码进行“近似”,将不可判定问题进行模拟定理证明(Theorem Proving)演绎方法(Deductive Methods)基于Floyd/Hoare 逻辑用如下形式表示程序的状态P C Q C: 可执行代码 P: Pre-condition,执行前的状态属性 Q: Post-

14、condition,执行后的状态属性利用推理/证明机制解决 语句复合问题符号执行通过使用抽象的符号表示程序中变量的值来模拟程序的执行,克服了变量的值难以确定的问题跟踪各路径上变量的可能取值,有可能发现细微的逻辑错误程序较大时,可能的路径数目增长会很快。可以选取重要的路径进行分析基于形式化方法的主要工具JPF 模型检测Bandera Slam, BLAST, CMCESC/JavaASTREEPREfix定理证明(Theorem Proving)模型检测(Model Checking)抽象解释(Abstract Interpretation)符号执行(Symbolic Execution)工具发

15、展的特点各自优势不同综合使用多种分析方法在准确度与时间开销上进行折中集成?2.5一种基于安全规则的方法软件安全形势变得越来越严峻程序源代码的规模越来越庞大采用传统的软件测试方法来检测源代码中潜在安全漏洞的难度增加可被利用的安全漏洞形式也不再局限于以往的常见漏洞基于安全规则的源代码分析方法研究2013-01-2952国内外源代码静态分析方法国内外静态安全分析工具词法语法分析基于抽象语法树的语义分析规则检查分析数据流控制流分析字符串匹配和模型化分析PMDFortify SCACheckmarx CxSuiteArmorize CodeSecureCoverity Prevent现有成果存在的问题

16、可检测漏洞的范围受限 & 检测结果的效率、准确率 & 规则简易性和描述能力基于安全规则的源代码分析方法研究基于安全规则的源代码分析方法2013-01-2953用户根据特定领域的需要自定义安全规则来描述待检测的安全漏洞模式特征根据用户定义的安全规则自动扫描待检测的源代码并解析通过基于安全规则的静态分析技术来检测程序源代码中潜在的安全漏洞基于安全规则的源代码分析方法研究基于安全规则的源代码分析过程2013-01-2954基于安全规则的源代码分析方法研究源代码预处理分析2013-01-2955 词法分析 语法分析抽象语法树的遍历对源代码逐个字符地读取,识别出关键字、标识符、常量和特殊符号等,同时过滤

17、掉空格、注释等无意义字符和行拼接处理将抽象语法树的遍历过程分为三个阶段,来收集后续依赖分析和安全分析所需要用到的源代码信息,并将收集到的信息存在相应的中间表示数据结构中根据语法规则识别出程序的语法结构,同时根据其语义动作构造抽象语法树,过滤掉由于文法等价转换(消除左递归、回溯、二义性文法)引入的多余的产生式基于安全规则的源代码分析方法研究基于安全规则的静态分析2013-01-2956基于安全规则的源代码分析方法研究安全规则及其描述语言2013-01-2957安全规则是使用其描述语言对程序源代码中潜在的安全漏洞模式的一种特征抽象。基于安全规则的静态分析过程必须根据用户输入的安全规则才能进行模式匹

18、配,查找出源代码中符合安全规则描述的安全漏洞。其语言需满足描述能力较强、语法简单且扩展性良好。基于安全规则的源代码分析方法研究基于Metal的设计2013-01-2958用户只需要了解待检测源代码的基本语法,相比于PMD等同类型软件易用性较好描述形式简单增加标识来特别处理上下文无关规则,避免了由于遍历源代码的控制流数据流信息产生的时间开销,提高检测效率。规则分类处理支持多语言中的类型和表达式,新增规则描述辅助类型,简化了用户对复杂规则的描述,提高了后续模式匹配的准确率描述能力强模式中增加类型检查和值约束,能在模式匹配的时候过滤掉用户不关心的变量和表达式语句,提高分析效率,同时也在一定程度上降低

19、了误报率模式增强基于安全规则的源代码分析方法研究基于有限状态机的安全规则漏洞检测模型2013-01-2959F=(S,s0,Fu,Fs)S是规则中自定义状态的集合;是规则中自定义漏洞模式的集合;是状态转换函数,(si,p)=Sd表示当有限状态机处在自定义状态si的情况下,如果源代码与规则模式匹配成功,则转移到相应的目的状态,由于目的状态可能存在多个,所以用集合Sd表示;s0是唯一的初始状态start;Fu是规则中自定义不安全终止状态的集合;Fs是规则中自定义安全终止状态的集合。基于安全规则的源代码分析方法研究基于有限状态机的安全规则漏洞检测模型2013-01-2960安全执行序列s0s1sms

20、n符合漏洞模型的不安全执行序列s0s1spsq实质:通过对源代码进行漏洞的特征模式匹配,在匹配成功的情况下完成状态转移,最后检测程序源代码执行序列的终止状态是否在用户自定义的不安全状态集合中安全规则的设计2013-01-2961上下文无关规则是一种用于检测程序源代码中某些特定类型表达式的约束信息的规则只对当前所匹配的表达式进行约束检查,与表达式所处的源代码上下文信息无关上下文相关规则是一种用于检测程序源代码中某些特定类型表达式序列组合约束的规则不仅需要当前所匹配表达式的信息,还需要结合与表达式的上下文相关信息,才能判断出该表达式的序列组合是否存在潜在的安全漏洞安全规则分类基于安全规则的源代码分

21、析方法研究安全规则的设计2013-01-2962状态变量:源代码变量匹配,进行状态绑定和转移辅助变量:与源代码变量的类型匹配,值约束检测虚拟变量:没有状态变量的上下文相关规则中充当 状态变量模式变量:对重复出现的模式进行事先定义转移规则:由起始状态、模式和目标状态组成。所有的模式匹配都从初始状态start开始。只有满足start状态后的模式,变量实例才进行状态绑定。状态由状态变量和状态值组成,用于跟踪状态变量或源代码随着模式匹配的状态转移过程安全规则核心元素转移规则变量基于安全规则的源代码分析方法研究3.4 安全规则描述语言2013-01-2963安全规则声明部分转移规则列表变量声明列表基于安

22、全规则的源代码分析方法研究安全规则库2013-01-2964方便用户重复使用自定义的安全规则安全规则库的设计:唯一标识码,规则名称,规则描述,规则的存放路径,适用的语言类型,规则分类,漏洞风险等级,推荐修复方案,规则入库时间相似安全规则检测:基于k-shingle和长度过滤的安全规则相似度检测算法规则描述字符串的k-shingle定义为其中任意长度为k的子串Jaccard相似度:基于安全规则的源代码分析方法研究安全规则库2013-01-29651删去规则描述字符串中的停用词,包括常见的“的”、“了”以及“为了”等,从而缩短规则描述字符串的长度,使得产生的k-shingle的集合变小,同时提高了

23、相似性检测结果的准确率2基于长度的过滤。在删除停用词的基础上,通过比较待检测相似字符串的长度,提前过滤掉一部分不符合相似度要求的规则描述,从而避免了产生k-shingle的集合和后续Jaccard相似度的计算,进一步提高算法效率假定两个安全规则字符串u和v的Jaccard相似度的上界为J,对于任意一个规则字符串s,且LuLv,则有u和v的Jaccard相似度SIM(u,v)最大值为Ku/Kv,其中K为k-shingle的集合大小,即Lv需要满足:基于安全规则的源代码分析方法研究基于k-shingle和长度过滤的安全规则相似度检测算法2013-01-2966算法3.1:基于k-shingle和长

24、度过滤的安全规则相似度检测算法输入:源规则字符串srcStr,目标规则字符串destStr,相似度sim,k-shingle中的k值 输出:实际相似度realSim方法:1: begin2: list initStopWordList(stopWordFilePath)3: for word list4: deleteStopWords(srcStr, destStr)5: if sim != 0 & Length(destStr) (Length(srcStr) - k + 1) / sim + k 1 then6: srcSet 7: destSet 8: for i = 0 to Len

25、gth(srcStr) k /k-Shingle(srcStr)9: srcSet.add(srcStri, i + k - 1)10: for j = 0 to Length(destStr) k /k-Shingle(destStr)11: destSet.add(destStrj, j + k - 1)12: intersection srcSet destSet13: union srcSet destSet14: realSim Size(intersection) / Size(union)15: else16: realSim -117: return realSim18:end

26、;基于安全规则的源代码分析方法研究总体结构2013-01-2967系统架构图程序中间表示的设计2013-01-2968 保证结构清晰、简单 保存源代码中所有的有效信息 记录源代码的行号信息程序结构部分语句部分类型部分表达式部分 常量部分程序中间表示基于安全规则的源代码分析方法研究源代码预处理分析模块2013-01-2969基于安全规则的源代码分析方法研究源代码预处理分析模块2013-01-2970算法4.1:加载类库中指定类的算法输入:完整类名name(必须使用命名空间加上类名称),类库文件绝对路径path输出:如果类库中指定类加载成功,未出现任何异常,则返回true;否则,不做任何加载操作,

27、返回false。1: begin2: type LoadFileAndGetType(path,name)3: if type != null then4: baseType getBaseType(type)5: list getInterfaceList(type)6: sp getNamespace(name)7: scene.addNamespace(sp)8: if isPublic(type) & isInterface(type) then9: addInterface(sp, type)10: else if isPublic(type) & isEnum(type) then

28、11: addEnum(sp, type)12: else13: addClass(sp, type)14: visitClassMembers(type)15: setBaseTypeAndInterfaces(type, baseType, list)16: if isGenericType(type) then17: list getActualTypeArguments(type)18: setGenerics(type, list)19: return true20: else21: return false22:end;基于安全规则的源代码分析方法研究4.2 源代码预处理分析模块2

29、013-01-2971算法4.2:获取指定泛型的泛型参数算法输入:泛型类型t输出:指定泛型的泛型参数列表list方法:1: begin2: genericName getGenericTypeDefinition(t)3: if + in genericName then4: i1 genericName.lastIndexOf(+)5: i2 genericName.lastIndexOf()6: if i1 i2 then 7: return null8: else9: list getSymbolIndex(, genericName)10: arguNum 0 /用于记录占位符后面泛型

30、参数的个数11: arguIndex 0 /用于记录下一次取泛型参数的索引12: for i list13: s genericNamei, Length(genericName) - 114: if + in s then15: plusIndex i + s.indexOf(+)16: arguNum getGenericArguNum(i + 1, plusIndex)17: else18: arguNum getGenericArguNum(i + 1)19: if !isLastGenericArgu(arguIndex, arguNum) then20: arguIndex arg

31、uIndex + arguNum21: for i = arguIndex to arguIndex + arguNum22: typeParams.add(getGenericArguments(t)i)23: return typeParams24: else 25: typeParams getGenericArguments(t)26: return typeParams27:end;基于安全规则的源代码分析方法研究安全规则静态分析模块2013-01-2972基于安全规则的源代码分析方法研究实验及结果2013-01-2973硬件:CPU:i3-2100 3.10GHz 内存:4.00

32、GB操作系统:Microsoft Windows 7 旗舰版 (32位)Java开发平台:JDK1.6,Eclipse 3.5.2,JRE1.62012年9月发布的Juliet Test Suite for Java的1.1.1版本,本文从中选取了有代表性的12种漏洞,有针对性的编写安全规则来检测该测试集中的安全漏洞,共有341个文件、353个类、2278个方法和113513行代码使用SASSR和PMD对实验数据集进行基于安全规则的源代码安全性分析来检测源代码中潜在的安全漏洞,并从规则的简洁性、检测效率、内存使用情况以及检测结果的准确性四个维度进行对比分析实验环境实验数据集实验方案基于安全规则

33、的源代码分析方法研究2013-01-2974实验结果规则定义基于安全规则的源代码分析方法研究实验结果2013-01-2975漏洞名称标准漏洞数SASSRPMD规则行数检测时间(单位:s)漏洞检测数规则行数检测时间(单位:s)漏洞检测数CWE78_OS_Command_Injection9560.02895231.08095CWE89_SQL_Injection17290.031172352.233158CWE209_Information_Leak_Error3670.02036200.80236CWE327_Use_Broken_Crypto1880.01518240.09418CWE330

34、_Insufficiently_Random_Values1880.01618270.98418CWE547_Hardcoded_Security_Constants1890.01318230.91618CWE597_Wrong_Operator_String_Comparison1870.01818210.35418CWE614_Sensitive_Cookie_Without_Secure18140.03617000CWE698_Redirect_Without_Exit35130.04134000CWE764_Multiple_Locks4130.0476000CWE765_Multip

35、le_Unlocks2140.0414000CWE832_Unlock_Not_Locked4120.0348000基于安全规则的源代码分析方法研究实验结果2013-01-2976漏洞总数误报数漏报数准确率=(漏洞数-误报数-漏报数)/漏洞数内存使用情况(单位:M)SASSR43893(438-9-3)/438 = 97.2%48PMD014(438-0-14)/438 = 96.8%15小结减小内存消耗:针对大规模程序的源代码中间表示的存储方式,或者对源代码中间表示进行改进,去掉不必要的数据结构和源代码信息安全规则细化分类:细分为控制流相关规则、数据流相关规则和对象流相关规则等,通过分类绑定

36、指定流图进行分析,提高规则检测效率安全规则及其描述语言扩展:支持更多种类的源代码模式,提高安全规则语言的描述能力2.6一种静态、动态相结合的方法基于静态分析的方法误报。商用工具20%及以上比例漏报基于动态分析的方法准确率高覆盖的问题,依赖测试用例集静动态结合快速的静态分析较全面获取疑似安全缺陷针对性的进行动态执行测试指导程序插桩、切片和用例生成降低测试开销去伪存真一种静动态分析结合的思路首先被测源程序经过静态检测后得到候选漏洞报告,利用候选漏洞报告指导生成测试场景和测试用例集,并构造程序自动机;然后将测试用例集作为动态检测的输入来驱动执行测试场景,在符合插桩规则的语句中插入桩代码;最后将实时运行信息与自动机状态匹配进行动态验证得到筛选后的漏洞报告,而流程中当测试用例集生成失败时会导致需要进行手工的动态验证。 测试场景(片段)测试场景。当一个三元组TS=(P,S,n),其中n表示一条感兴趣的语句

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论