导图社区 OSG9第二十一章 恶意代码和应用攻击
CISSP(Certification for Information System Security Professional)即信息系统安全专业认证,这一证书代表国际信息系统安全从业人员的权威认证
编辑于2023-08-01 20:39:39 广东关于GBT 35273—2020个人信息安全规范的思维导图,本标准规定了开展收集、存储、使用、共享、转让、公开披露、删除等个人信息处理活动应遵循的原则和安全要求。
CISSP(Certification for Information System Security Professional)即信息系统安全专业认证,这一证书代表国际信息系统安全从业人员的权威认证
CISSP(Certification for Information System Security Professional)即信息系统安全专业认证,这一证书代表国际信息系统安全从业人员的权威认证
社区模板帮助中心,点此进入>>
关于GBT 35273—2020个人信息安全规范的思维导图,本标准规定了开展收集、存储、使用、共享、转让、公开披露、删除等个人信息处理活动应遵循的原则和安全要求。
CISSP(Certification for Information System Security Professional)即信息系统安全专业认证,这一证书代表国际信息系统安全从业人员的权威认证
CISSP(Certification for Information System Security Professional)即信息系统安全专业认证,这一证书代表国际信息系统安全从业人员的权威认证
第二十一章 恶意代码和应用攻击
21.1 恶意软件
恶意软件包括广泛的软件威胁,这些威胁利用网络、操作系统、软件和物理安全漏洞对计算机系统散播恶意载荷
API安全
子主题
API主要关注加密和认证的问题
安全编码实践
21.1.1 恶意代码的来源
在早期,恶意代码的编写者都是相当有经验(可能误入歧途)的软件开发人员,他们会为自己精心构思的、富有创意的恶意代码技术感到骄傲
如今这个时代出现了一些脚本小子,他们并不理解安全漏洞的内在机理,只会从网上下 载现成的软件(或脚本程序),并利用这些软件对远程系统进行攻
恶意软件开发的最新趋势是高级持续性威胁(APT)的兴起。
21.1.2 病毒
计算机病毒可能是最早的令安全管理员苦恼的恶意代码。
像生物病毒那样,计算机病毒主要有两个功能:传播和有效载荷执行
1. 病毒传播技术
主引导记录病毒
主引导记录(master boot record, MBR)病毒:是已知最早的病毒感染式
MBR 是一个单独的磁盘扇区,通常是在启动过程初始阶段读取的介质的第一个扇区。
病毒攻击 MBR一可启动介质(如硬盘或 U 盘)上用于在计算机启动过程中加载操作系统的部分
MBR 非常小(通常只有 512 字节),因此它装不下实现病毒传播和破坏功能所需的全部代码
病毒会引导系统读取并执行存储在其他地方的代码,从而将病毒载入内存,并可能触发病毒有效载荷的传递
大多数 MBR 病毒通过用户不经意地共享被感染介质的活动在系统之间进行传播
文件感染病毒
文件感染病毒:许多病毒感染不同类型的可执行文件,并且在操作系统执行这些文件时被激活
Windows 系统上,文件感染病毒通常影响可执行文件和脚本,例如以.exe、 .com 和msc 扩展名结尾的文件和脚本
文件感染病毒的一个变体是同伴病毒。这种病毒是自包含的可执行文件,利用与合法的操作系统文件类似又稍有不同的文件名来躲避检查。
宏病毒
宏病毒: 一些应用程序为了自动执行重复任务而实施了某些脚本功能。这些功能通常使用简单却有效的编程语言,俐如 Visual Basic for Applications(VBA) 。
最早出现在 20 世纪 90 年代中期,它采用初级的技术感染 Microsoft Word 文档(.doc)。
限制不受信的宏在没有用户明确许可的情况下运行的能力。这导致宏病毒的数量急剧减少。
服务注入病毒
服务注入病毒 最近爆发的恶意代码使用另一种感染系统并逃脱检测的技术一将自己注入可信的操作系统运行进程中,如 svchost.exe、 winlogon.exe 和 explorer.exe
最佳技术是确保为浏览 Web 内容的所有软件(如浏览器、媒体播放器、帮助程序)打上最新的安全补丁
2. 病毒技术
复合病毒
复合病毒:试图使用多种传播技术渗透只防御其中一种技术的系统
例如,病毒可能通过向每个文件添加恶意代码来感染关键的 COM 和 EXE 文件,使其成为文件感染病毒。
然后,同一病毒还可能将恶意代码写入系统的主引导记录,从而使其成为引导扇区病毒
隐形病毒
隐形病毒:通过篡改操作系统来隐藏自己以欺骗反病毒软件,使其认为一切正常
例如,隐形的引导扇区病毒可能利用恶意代码覆盖系统的主引导记录,随后还通过修改 操作系统的文件访问功能来覆盖自身痕迹(MBR)
多态病毒
多态病毒:在系统间传输时,多态病毒实际上会修改自身的代码。这种病毒的传播和破坏技术不会变化,只是每次在感染新的系统后,病毒的特征都会略有改变
多态病毒制造者就是希望通过连续改变特征来 使基于特征的反病毒软件失效
加密病毒
加密病毒:使用加密技术(参阅第 6 章)来躲避检测
加密病毒使用一个很短的、被称为病毒解密程序的代码段这个代码段包含必要的密码信息,这些信息用于对存储在磁盘其他地方的主病毒代码进行加载和解密
病毒解密过程往往包含明显特征,因此加密病毒很容易被最新的反病毒软件攻破。
3. 病毒恶作剧
如果不提及由病毒恶作剧(hoax) 导致的损害和资源浪费,对病毒的研究就不算完整
除了电子邮件外,恶意软件恶作剧现在主要通过Facebook、 Twitter、 WhatsApp、 Snapchat 和其他社交媒体和消息平台传播
21.1.3 逻辑炸弹
逻辑炸弹:是感染系统并且在满足一个或多个条件(如时间、程序启动、 Web 站点登录、某些按键等)前保持休眠状态的恶意代码对象
例如, 2019 年 7 月,西门子公司的一名承包商承认,他根据合同编写的软件中包含逻辑炸弹。其目的是周期性地破坏软件,并要求西门子再次雇用他来解决问题,从而保证他有稳定的业务
21.1.4 特洛伊木马
特洛伊木马:也是一种软件程序,它表面友善,但实际却包含了恶意有效载荷,可能对系统或网络造成破坏。
最近,对安全造成重大影响的一类木马是流氓杀毒软件
远程访问木马(remote access Trojan, RAT):是特恪伊木马的一个子类,它在系统中打开后门,使攻击者能够远程控制被感染的系统。
其他特洛伊木马旨在窃取受感染系统的计算能力,以挖掘比特币或其他加密货币
僵尸网络:主要症状是网速变慢,特洛伊木马使所有被感染的系统成为某个僵尸网络(botnet) 的成员,僵尸网络由互联网上被僵尸牧人(botmaster)控制的众多计算机,可对某个web站点进行DOS攻击
21.1.5 蠕虫
蠕虫:给网络安全带来了重大风险。它们和其他恶意代码对象有相同的破坏潜力,并且另 有变化一一不需要人为干预就可以传播它们自己
互联网蠕虫是互联网上发生的首例主要的计算机安全事件。
1. Code Red 蠕虫
2001 年夏天, Code Red 蠕虫在未打补丁的 Microsoft Internet Information Server(IIS)Web服务器之间快速传播,这使其受到了媒体的极大关注。
Code Red感染后 三个恶意操作
随机选择成百上于个 IP 地址,随后探测这些地址,看这些主机运行的 IIS 版本是否有漏洞
破坏本地 Web 服务器上的 HTML 页面,将正常的内容替换为下面的文本:Welcome to http://www.worm.com!
向系统植入一个逻辑炸弹,这个逻辑炸弹将向 198.137.240.91 发起拒绝服务攻击,该IP 当时属于美国白宫主页的 Web 网站服务器
RTM 与互联网蠕虫
1988 年 11 月,一位年轻的名叫 Robert Tappan Morris 的计算机专业学生,仅用几行计算 机代码就使刚刚起步的互联网遭受重创
这个蠕虫利用 UNIX 操作系统中 4 个特殊的安全漏洞进行传播。
Sendmail 调试模式: 当时流行的 Sendmail 软件的最新版本用于在互联网上对电子邮件进行路由,但它存在一个漏洞。蠕虫利用这个漏洞向远程系统上的 Sendmail 程序发送特殊的、包含蠕虫代码的破坏性电子邮件来传播自己
密码攻击: 这个蟠虫还使用了字典攻击,试图通过使用一个有效系统用户的用户名和密码来获得对远程系统的访问权限
finger 漏洞: 流行的互联网实用程序 fmger 允许用户确定谁登录在远程系统上。包含一个缓冲区溢出漏洞,蠕虫利用这个漏洞进行传播(稍后将对缓冲区溢出进行详细讨论)
信任关系: 在感染系统后,该蠕虫分析系统和其他系统之间存在的信任关系,并且试图通过信任途径传播
2. 震网病毒
2010 年 6 月,名为震网(Stuxnet)的蠕虫在互联网上出现
这个非常复杂的蠕虫使用了多种高级技术来传播,包括利用多个以前未披露的漏洞。
震网病毒使用以下传播技术:
在本地网络上搜索未受保护的管理共享系统
利用 Windows Server service 和 Windows Print Spooler service 中的零日漏洞
使用默认的数据库密码连接系统
通过使用受感染的共享U 盘驱动器进行传播
震网病毒在从一个系统传播到另一个系统的过程中,不会破坏系统,它实际上在寻找一种特殊的系统一由西门子公司制造的控制器系统,据称是用于生产核武器材料的系统
它会执行一系列操作以摧毁连接到西门子控制器的离心机
震网病毒似乎从中东开始传播,特别针对位于伊朗境内的系统。据称,它由西方国家设 计,意图破坏伊朗核武器计划
美国的相关努力”表明该病毒是一个美国-以色列项目,用于破坏伊朗的核计划”
21.1.6 间谍软件与广告软件
间谍软件
间谍软件:会监控你的行为,并向暗中监视你活动的远程系统传送重要细节
例如,间谍软件可能等你登录某个银行站点,随后将你的用户名和密码传给间谍软件的作者,此外,间谍软件也可能等你在某个电子商务站点输入信用卡号,然后将卡号传给在黑市进行贩卖交易的骗子。
广告软件
广告软件:在形式上与间谍软件相似,只是目的不同。广告软件使用多种技术在被感染的 计算机上显示广告
最简单的广告软件会在你访问网站时在屏幕上弹出广告。恶毒的广告软件则可能监控你的购物行为,并将你重定向到竞争者的网站
广告软件和恶意软件的作者通常利用流行的互联网工具的笫三方插件(如 Web 浏览器)来传播其恶意内容
间谍谍软件和广告软件都属于潜在有害程序(Potentially unwanted program,PUP)
21.1.7 勒索软件
勒索软件是一种利用加密技术的恶意软件
勒索软件生成一个只有勒索软件作者知道的加密密钥,并使用该密钥加密系统硬盘和任何已安装的驱动器上的关键文件
加密使授权用户或恶意软件作者以外的任何人都无法访问数据。
21.1.8 恶意脚本
我们经常会见到使用 PowerShell 和 Bash 等语言编写的脚本库,它们以高度自动化的方式执行一系列命令行指令
不幸的是,恶意攻击者也可以使用同样的脚本技术来提高效率。特别是, APT 组织经常利用脚本自动化其恶意活动的常规部分
例如,他们可能会在每次试图获取新 Windows 系统访问权限时运行 PowerShell 脚本,尝试一系列特权提升攻击
恶意脚本通常也存在于一类名为“无文件恶意软件”的软件中。这些无文件攻击从不将文件写入磁盘,使其更难被检测到
21.1.9 零日攻击
许多形式的恶意代码利用了零日(zero-day)漏洞(黑客发现的还没有被安全社区彻底修复的安全漏洞)
系统受零日漏桐影响的主要原因有两个
攻击者发现新型恶意代码,到安全社区发布补丁和反病毒库更新,期间必然存在延迟。这被称为脆弱性窗口
统管理员应用更新的速度缓慢。
强大的补丁管理程序、最新的反病毒软件、配置管理、应用程序控制、内容过滤和其他保护措施
21.2 恶意软件预防
21.2.1 易受恶意软件攻击的平台
大多数计算机病毒都是为了在运行世界上最流行的操作系统(Microsoft Windows)的计算 机上执行破坏活动而设计的
2020 年 av-test 的分析中,研究人员估计,大约有 83%的恶意软件是针对 Windows 平台的
值得注意的是, Mac 系统上的恶意软件数量最近增加了三倍,而针对 Android 设备的恶意软件变体数量在同一年翻了一番
21.2.2 反恶意软件
本质上,防病毒软件维护一个包含所有已知病毒特征的超大数据库。根据防病毒软件包的配置设置,它会定期扫描存储介质,检查其中是否有包含符合这些条件的数据的文件
防病毒软件将执行以下操作之一:
如果该软件能够根除病毒,它将处理受影响的文件,并将机器恢复到安全状态。
如果软件识别出病毒,但不知道如何处理被照染的文件,它可能会隔离这些文件,直到用户或管理员手动处理他们
如果安全设置/策略未提供隔离,或者文件超出了预定义的危险阙值,防病毒软件可 能会删除受感染的文件,以保持系统的完整性。
还有一些防病毒软件使用启发式机制来检测潜在的恶意软件感染。这些方法分析软件的行为寻找病毒活动的迹象,例如试图提升特权等级,掩盖其电子轨迹,以及更改无关的或操作系统的文件
现代防病毒软件产品能够检测和删除各种类型的恶意代码,然后清理系统。
反恶意软件还包括集中式监视和控制功能,管理员可以从集中控制台强制执行配置设置 和监控警报
21.2.3 完整性监控
其他安全软件,如文件完整性监控工具,也提供了辅助性的防病毒功能
这些工具旨在提醒管理员文件可能遭到了未经授权的修改
这些系统通过维护存储在系统上的所有文件的哈希值来工作(有关用于创建这些值的哈 希函数的完整讨论,请参阅第 6 章
21.2.4 高级威胁保护
端点检测和响应(Endpoint Detection and Response,EDR):包超越了传统的反恶意软件防护方案,帮助端点抵御攻击
将传统防病毒软件中的反恶意软件功能与旨在更好地检测威胁并采取措施消除威胁的先进技术相结合
EDR 包的一些特殊功能
分析端点内存、文件系统和网络活动是否存在恶意活动迹象
自动隔离可能的恶意活动以控制潜在损害
与威胁情报源集成,以实时了解互联网其他地方的恶意行为
其他事件响应机制集成以自动化响应工作
托管 EDR 产品称为托管式检测和响应(MOR)服务。
用户和实体行为分析(User and Entity Behavior Analytics,UEBA):软件特别关注端点和其他设备上基于用户的活动,它构建每个人正常活动的概要文件,然后突出显示用户活动与该概要文件的偏差,这些偏差表明可能存在潜在的危害
UEBA 与 EDR 的不同之处在于, UEBA 的分析重点是用户,而 EDR的分析重点是端点
21.3 应用程序攻击
21.3.1 缓冲区溢出
当开发人员没有正确验证用户的输入以确保用户输入适当大小的内容时,就会存在缓冲区溢出漏洞
输入太多而“溢出“原有的缓冲区,就会覆盖内存中相邻的其他数据。
预防措施
户输入的值的长度不能超过存放它的缓冲区的大小(例如,将一个具有 10 个字母的单词输入最多可容纳 5 个字母的字符串变量中)。
用户不能向保存输入值的变量类型输入无效的值(例如,将一个字母输入一个数字型变量中)。
用户输入的数值不能超出程序规定的参数范围(例如,用”也许”来回答结果只能为”是”或“否"的问题)。
如果没有做上述检查,将可能造成缓冲区溢出漏洞,这种漏洞会导致系统崩溃,甚至可 能允许用户运行 shell 命令以获得系统访问权限
缓冲区溢出漏洞在使用通用网关接口(common gateway interface, CGI)或其他语言进行快速 Web 开发的代码中尤其普遍,这种开发方案允许没有经验的编程人员快速生成交互式Web页面
21.3.2 检查时间到使用时间
检查时间(time of check, TOC):是主体检查客体状态的时间。在返回到客体以访间 它之前,可能要做几个决定。当决定访问客体时,过程在使用时间(time of use, TOU)访问它。
检查时间到使用时间(TOCTTOU 或 TOC/TOU)攻击:通常被称为竞态条件,因为攻击者赶在合法过程使用客体之前替换它
TOCTTOU 攻击的一个典型示例是在验证数据文件的身份后,在读取数据前替换数据文件。通过将一个真实的数据文件替换为攻击者选择和设计的文件,攻击者可以潜在地以多种方式引导程序的操作
TOCTTOU 攻击、竞态条件攻击和通信中断被称为状态攻击,因为它们攻击的是特定时间、数据流控制以及系统状态之间的转换。
21.3.3 后门
后门是没有被记录到文档中的指令序列,它们允许软件开发人员绕过正常的访问限制。
在开发和调试过程中,后门常用于加快工作流程,以免系统不断要求开发人员进行身份认证。
除了开发人员植入的后门外,许多恶意代码感染系统后也会留后门,以允许恶意代码的开发者远程访问受感染的系统
无论怎样,后门不被记录到文档中的性质使其成为系统安全的严重威胁
21.3.4 特权提升和 rootkit
攻击者一旦在系统上站稳脚跟,通常会迅速向第二个目标迈进—计各他们的访问权限从 普通账号提升为管理员账号。他们通过特权提升攻击来实现此目标
特权提升攻击的常见方法之一是使用 rootkit 。 rootkit 可从互联网上免费获得,它利用操 作系统上已知的漏洞
攻击者经常通过使用密码攻击或社会工程获得系统的普通用户账户的访问权哏,然后利用 roo如t 将访问权限提高到 root(或系统管理员)级
系统管理员必须关注厂商针对操作系统发布的最新补丁,并持续应用这些补救措施
21.4 注入漏洞
注入漏洞是攻击者用来突破 Web 应用程序并访问该应用程序所在系统的主要机制之一。
这些漏洞允许攻击者向 Web 应用程序提交某种类型的代码作为输入,并诱使 Web 服务器执行该代码或将其提供给其他服务器执行
例如 SQL 注入、轻量级目录访问协议(LDAP)、 XML 注入、命令注入、 HTML 注入、代码注入和文件注入。
21.4.1 SQL 注入攻击
Web 应用程序通常会接收来自用户的输入并将其组合成一个数据库查询语句,最后把查 询结果返回用户
1. 基于内容的盲注
在基于内容的盲注中,攻击者在尝试执行攻击前会向 Web 应用程序发送输入,以测试该 应用程序是否会解释注入的代码
例如,一个 Web 应用程序要求用户输入账号, OR 1=1 条件的 SELECT 查询将匹配所有的结果
2. 基于计时的盲注
除了根据应用程序返回的内容来评估应用程序是否受盲注攻击的影响外,渗透测试人员 还可使用处理查询所需的时间作为从数据库检索信息的通道
如果应用程序在 15 秒延迟后返回结果,则它可能会受到攻击。
21.4.2 代码注入攻击
任何将用户提供的输入插入应用程序开发人员编写的代码中的环境都可能受到代码注入攻击
LDAP注入
例如,攻击者可以在作为轻量级目录访问协议(LDAP)查询的一部分发送的文本中嵌入命令,从而进行 LDAP 注入攻击,攻击的重点是LDAP 目录服务的后端,而不是数据库服务器
这种威胁与 SQL 注入类似,输入验证和转义以及防御性编码对于消除这种威胁至关重要
XML注入
XML 注入是另一种类型的注入攻击,后端目标是XML 应用程序
同样,输入转义和验证可以应对这种威胁
DLL注入攻击
DLL 注入攻击中,命令甚至可能试图加载包含恶意代码的动态链接库(dynamically linked library, DLL) 。
21.4.3 命令注入攻击
在某些情况下,应用程序代码可能返回到操作系统以执行命令
这尤其危险,因为攻击者可能会利用应用程序中的漏洞进行攻击,从而获得直接操纵操作系统的能力
此命令序列删除 /home 目录及其包含的所有文件和子文件夹
21.5 利用授权漏洞
授权漏洞,这些漏洞允许攻击者获得超出授权的访问级别。
21.5.1 不安全的直接对象引用(横向越权)
在某些情况下, Web 开发人员设计的应用程序根据用户在查询字符串或 POST 请求中提供的参数直接从数据库检索信息
例如,以下查询字符串可用于从文档管理系统中检索文档(当然,将[companyname)替换为特定组织的名称):
这是因为攻击者可以轻松查看此URL, 然后对其进行修改以尝试检索其他文档,例如
如果应用程序不执行授权验证,用户则可能查看超出其权限的信息。这种情况被称为不安全的直接对象引用。
21.5.2 目录遍历
某些 Web 服务器存在安全配置错误,允许用户浏览目录结构并访问本应保密的文件
21.5.3 文件包含
文件包含:是实际执行文件中包含的代码,从而使攻击者能够欺骗Web 服务器执行其目标代码
文件包含攻击有两种变体:
本地文件包含攻击:试图执行存储在 Web 服务器上其他位置的文件中的代码
远程文件包含攻击:允许攻击者进一步执行存储在远程服务器上的代码。这类攻击尤其危险,因为攻击者可以直接控制执行的代码,而不必将文件先行存储在本地服务器上。
当攻击者发现文件包含漏洞时,他们通常会利用该漏洞上传 Web shell 到服务器。
21.6 利用 Web 应用程序漏洞
21.6.1 跨站脚本
跨站脚本(cross-site scripting, XSS)攻击
1. 反射 XSS
XSS 攻击通常发生在应用程序允许反射输入时。例如,假设一个简单的 Web 应用程序包 含单个文本框,要求用户输入其名称
最佳解决方案应当是:首先确定允许的输入类型(白名单),然后应用程序通过验证实际输入来确保其与指定的模式相匹配
2. 存储/持续 XSS
这类攻击被描述为持久性攻击,因为即使攻击者没有主动发起攻击,它们也会留在服务器上
XSS 攻击也可用于将用户重定向到钓鱼网站,请求敏感信息或执行其他攻击。
有些XSS攻击非常隐蔽,它们通过修改用户浏览器中的文档对象模型(DOM)环境
21.6.2 请求伪造
请求伪造攻击利用信任关系,并试图让用户无意中对远程服务器执行命令
跨站请求伪造(cross-site request forgery, CSRF)
跨站请求伪造攻击,简称为 XSRF 或 CSRF 攻击,类似于跨站脚本攻击,但利用不同的信任关系。
服务器端请求伪造(server-side request forgery, SSRF)
服务器端请求伪造(SSRF)攻击利用了类似的漏洞,但它们不诱骗用户的浏览器访问U肛,而是诱骗服务器根据用户的输入访问 URL
21.6.3 会话劫持
当恶意的个人拦截授权用户和资源之间的部分通信,然后使用劫持技术接管会话并假冒 授权用户的身份时,即发生了会话劫持攻击。
下面列了一些常用技术:
捕获客户端和服务器之间身份认证的详细信息,并用这些信息假冒客户端的身份。
诱使客户端认为攻击者的系统就是服务器,在客户端与服务器建立合法连接时充当中介,然后断开客户端的连接。
使用未正确关闭连接的用户的 cookie 数据访问 Web 应用程序,或使用设计糟糕的未 正确管理身份认证 cookie 的应用程序的 cookie 数据访问 Web 应用程序。
通过管理控制(如反重放身份认证技术)和应用程序控制(如在合理的时间内使 cookie 过期)加以解决。
21.7 应用程序安全控制
21.7.1 输入验证
输入验证。允许用户输入的应用程序应该对输入进行验证,以降低其包含攻击的可能性。
最有效的输入验证形式是使用输入白名单(也称为允许列表)
元字符:是被赋予特殊编程含义的字符,典型的例子包括:单引号和双引号、方括号、反斜线、分号、&符号
参数污染:通过向 Web 应用程序发送同一输入变量的多个值来运行。
21.7.2 Web 应用程序防火墙
Web 应用程序防火墙(WAF)在确保Web 应用程序免受攻击方面也发挥着重要作用
WAF 的功能类似于网络防火墙,但它们工作在 OSI 模型的应用层,如第 11 章所述 WAF位于 Web 服务器前面(如图 21.8 所示),接收所有到服务器的网络流量
然后,它将检查传给应用程序的输入,在将输入传给 Web 服务器之前执行输入验证(白名单和/或黑名单)
21.7.3 数据库安全
关系数据库是大多数现代应用程序的核心,对这些数据库的保护并非仅限于使它们免受 SQL 注入攻击。
1. 参数化查询和存储过程
在参数化查询中,开发人员准备一个 SQL 语句,然后允许将用户输入作为精心定义的变量传递给该语句,不允许在这些变量中插入代码
例如, Java 使用PreparedStatementO 函数,而 PHP 使用 bindParamO 函数。
客户端不直接向数据库服务器发送 SQL 代码。相反,客户端向服务器发送参数,然后服务器将这些参数插入预编译的查询模板中
这种方法既可以防止注入攻击,又可以提高数据库的性能。
2. 混淆和伪装
在数据库中维护敏感个人信息的组织面临信息被攻击者窃取的风险
防止数据泄露措施:
数据最小化是最好的防御措施。组织不应收集他们不需要的敏感信息,并应在不再需 要将其收集的敏感信息用于合法业务目的时尽快处置它们
标记化用查找表将可能直接显示个人身份的个人标识符替换为唯一标识符。例如,可 以用随机生成的 10 位数字替换广为人知的值,例如学号。
哈希技术使用加密哈希函数将敏感标识符替换为不可逆的替代标识符
21.7.4 代码安全
软件开发人员还应该采取措施保护代码的创建、存储和交付
1. 代码签名
开发人员通过加密函数用自己的私钥对代码进行数字签名,之后浏览器可以使用开发人员的公钥来验证签名,确保代码合法且未被非授权的人修改
尽管代码签名可以保证代码来自真实的源且未被修改,但并不能保证代 码中不包含恶意内容
2. 代码重用
许多组织不仅在内部重用代码,而且会以使用第三方软件库和软件开发工具包(SDK) 的方式重用代码。
安全专业人员应该熟悉在他们的组织中使用第二方代码的各种方式,以及他们的组织向其他人提供服务的方式。共享代码中常常出现安全缺陷
3. 软件多样性
安全专业人员应该注意组织中依赖于单个源代码、二进制可执行文件或 编译器的位置。
安全专业人员致力于避免其环境中的单点故障,以免单个组件出现问题时影响可用性。
4. 代码仓库
代码仓库是用于存储和管理应用程序源代码的集中位置
代码仓库的主要目的是将软件开发中使用的源文件存储在一个集中的位置,以便安全存储和协调多个开发人员做出的更改
代码仓库还执行版本控制,以跟踪代码的变更并在需要时将代码回滚到早期版本
代码仓库也有助于避免死代码的问题,死代码即组织中正在使用但没有人负责维护的代码,事实上,甚至没有人知道原始源文件位于何处。
5. 完整性度量
代码完整性度量:使用加密哈希函数来验证发布到生产环境中的代码是否与先前批准的代码相匹配
6. 应用程序韧性
设计应用程序时,应该使它们能够适应不断变化的需求。
两个相关的原则
可扩展性:表示应用程序的设计应使其所需的计算资源可以逐渐增加,以支持不断增长的需求; 这可能包括向现有的计算实例中添加更多的资源,这称为垂直扩展或“向上扩展”。 它还可能包括向资源池中添加其他实例,这称为水平扩展或“向外扩展”
弹性:比可扩展性更进一步,它表示应用程序在必要时可以自动提供资源以进行扩展,然后在不再需要时自动撤销这些资源以降低容量(和成本)。你可以把弹性看作根据需要上下伸缩的能力
21.8 安全编码实践
21.8.1 源代码注释
注释是优秀开发人员工作流桯的重要组成部分
然而,注释也可能向攻击者提供解释代码工作原理的路线图
对于己编译的可执行文件,这是不必要的,因为编译器会自动从可执行文件中删除注释
公开代码的 Web 应用程序可能允许远程用户查看代码中留下的注释,在这些环境中,开发人员应该在部署前从生产版本的代码中删除注
21.8.2 错误处理
攻击者利用代码中的错误进行攻击
许多编程语言包括 try... catch 功能,允许开发人员显式指定如何处理错误
例如,如果 Web 表单请求一个年龄作为输入,那么仅验证年龄是否为整数是不够的。攻击者可能在该字段中输入 50000 位整数,试图执行整数溢出攻击
错误处理的另一面一一过于详细的错误处理例程也可能存在风险。如果错误处理例程对代码的内部工作原理解释得太多,则可能会让攻击者找到利用代码的方法
21.8.3 硬编码凭证
在某些情况下,开发人员可能会使源代码包含用户名和密码。
硬编码凭证的第二种变体发生在开发人员使其源代码包含其他服务的访问凭证时。如果该代码被有意或无意泄露,那么这些凭证将为外部人员所知
当开发人员意外地将包含 API密钥或其他硬编码凭证的代码发布到公共代码仓库(如 GitHub) 时,通常会出现这种情况。
21.8.4 内存管理
应用程序通常负贞管理自己使用的内存,在这神情况下,槽糕的内存管理做法可能会破坏整个系统的安全性。
1. 资源耗尽
对于系统上的内存或任何其他有限资源,我们需要注意的问题之一是资源耗尽。
内存泄漏是资源耗尽的一个例子
存在内存泄漏的应用程序没有返回不再需要的内存,这可能只是因为它无法跟踪己写入内存保留区域的对象
如果应用程序长时间这样做,它可能会慢慢耗尽系统中所有可用的内存,导致系统崩溃
重启系统通常会重置问题,释放内存以用于其他用途,但是如果内存泄漏问题没有得到纠正,那么仍会重新开始这个循环。
2. 指针解引用
内存指针也会导致安全问题。指针是应用程序开发中常用的概念。它们是存储内存中另 一个位置地址的内存区域
可能出现的一个特殊问题是当指针为空时,其中包含程序员所称的 NULL 值
NULL指针异常会导致程序崩溃,使攻击者能够访问调试信息,这些信息可用于侦察应用程序的安全性
最坏的情况下, NULL 指针异常可能允许攻击者绕过安全控制。