接上文:
在本文中,我们将深入地探讨,在通过外部函数接口(Foreign Function Interface,FFI)将基于C/C++的库“粘合”到解释语言的过程中,安全漏洞是如何产生的。
从攻击者角度看问题
从攻击者的角度来看,了解我们可以控制什么,如何控制,以及我们可以影响什么,对于实现bug的可利用性至关重要。此外,可利用性还受到目标代码实际使用方式和地点的影响。
如果我们处理的是一个库代码中的bug,而这个库可能被用在更大的软件中,这就为我们作为攻击者提供了各种额外的交互机会和影响力。此外,触发bug的操作环境也非常重要。操作系统、系统的硬件以及它们的软件生态系统都在各种配置中启用了不同级别的系统级缓解措施。在一个操作系统上可以通过缓解措施阻止的漏洞可能在另一个操作系统上完全可以被利用。
在png-img案例中,假设我们面对的是最基本的攻击环境:一个单一的Javascript文件,需要png-img包,然后用它来加载攻击者提供的PNG文件。
大多数现代内存破坏攻击都需要对目标进程内存布局有所了解。因为我们正在重写内存,所以知道它们在原始内存布局中的位置有助于我们构造替代性的,但功能正常的内存内容,以供目标进程使用。
作为攻击者,他们希望滥用这些新的内存内容来欺骗涉及它们的算法来执行对他们有利的操作。通常来说,攻击者的目标是执行任意代码或命令,但攻击者的目标也可能是更深奥的行为。例如,攻击者也可能想要重写身份验证标志,削弱随机数生成器,或以其他方式颠覆软件中的安全关键逻辑。除此之外,即使只是让一个进程不可用,本身就可以成为目标,因为它可能导致意想不到的安全影响。
由于缺乏内存布局缓解措施,我们可以对给定的目标二进制代码及其相关的内存布局进行盲目的假设,或者通过信息泄露来了解内存布局。
信息泄露可以是简单的,例如通过其他的或重新设计的bug来泄漏内存的内容,也可以是复杂的,例如使用基于计时或崩溃的探测方法来确定某个特定库的进程内存的某个部分可能存在的位置。需要注意的是,要想利用信息泄露来推进漏洞利用过程,通常需要与目标流程进行反复交互。
由于在我们的single-shot场景中,我们将无法动态地了解目标进程的内存布局,因此,我们将不得不依靠运气和有根据的猜测相结合的方式,在触发内存破坏时判断内存中的位置信息。
首先,我们需要找出针对目标节点二进制文件必须处理的缓解措施。为此,我们可以使用GDB Enhanced Features(GEF)插件中提供的checksec命令。
我们可以看到,我们的目标二进制文件并非一个位置无关的可执行文件(Position Independent Executable,PIE)。这意味着,在同一平台上每次运行这个特定的二进制文件时,Node可执行文件的.text和.data段在内存中的位置保持不变。这对我们的single-shot场景非常有帮助,因为这种知识给了我们一个进入可执行代码和程序数据已知位置的钩子。如果我们测试平台上的Node二进制文件被编译成PIE,由于地址空间布局随机化(ASLR)已经推广到了现代linux上的PIE二进制文件,所以,在远程的single-shot场景中对这个漏洞的实际利用会受到很大的阻碍。
如果我们没有类似GEF的checksec这样的工具可用,我们也可以直接使用file命令。由于PIE二进制文件就是类型为ET_DYN(共享对象文件)的Elf可执行文件,所以,它们将会显示为共享库,而非PIE二进制文件则是ET_EXEC(可执行文件)类型。例如,如果我们将非PIE Node二进制文件与我们测试平台(x86_64 Ubuntu 18.04.4LTS)上的PIE bash二进制文件进行比较,则需要注意以下几点:
现在,我们知道了相应的操作环境,以及在尝试利用漏洞时可能知道哪些内存内容,这样的话,我们可以开始决定我们要用堆内存控制技术来颠覆哪些算法了。
在这种情况下,会想到三个潜在的选择,从特定于应用程序到特定于平台的范围,具体如下所示:
对我们而言,这三个选项中哪一个最有意义,主要取决于我们愿意为漏洞利用尝试投入多少时间和精力。但是,就概念验证级别的工作来说,我们需要采取最便捷的漏洞利用途径。为了确定哪条路径,我们必须跟该漏洞打交道,并进行一些动态分析。
构造触发器
到目前为止,我们已经对很多事情进行了理论上的探讨。例如,我们探讨了攻击者判断某个bug是否值得利用时,会考虑哪些因素。既然我们已经决定要尝试利用png-img bug,那么是时候开始鼓捣该bug本身了。
首先,让我们归纳出这个bug的基本触发条件:我们要创建一个PNG文件,用于触发整数溢出,从而导致data_数组内存分配不足,随后用我们精心制作的PNG行数据覆盖堆内存。此外,在libpng的PNG分块解析过程中,我们还必须通过一些校验和检查,这样,我们的恶意PNG数据才能被顺利接受,以进行后续处理。
PNG文件由一个PNG签名和一系列PNG分块组成。这些分块可以进一步分解为:一个4字节的分块长度、一个4字节的分块类型、一个可变长度的分块数据,以及一个4字节的分块类型和数据的CRC校验和。PNG中的第一个分块是IHDR分块,其中规定了图像的宽度和高度。
回顾易受攻击的png-img绑定代码,我们可以发现图像高度是我们需要控制的变量之一,它用于触发整数溢出。另一个变量是一行的字节数。让我们来看看png-img,以及随后的libpng是如何从我们提供的PNG文件中填充这些数据的。
png-img中加载PNG数据的主要入口点是PngImg::PngImg构造函数,其内容如下所示:
在[1]处,调用了ReadInfo_,它实际上是一个通过libpng的png_read_info函数填充大多数PNG信息的函数。
png_read_info将遍历所有PNG分块,提取与PNG图像相关的信息,处理IHDR分块,并调用png_handle_IHDR。
在[1]处,我们看到代码从IHDR分块数据中提取宽度和高度(整数);在[2]处,我们看到它通过PNG_ROWBYTES宏导出rowbytes值,这是根据单个像素占用的位数将像素宽度简单转换为表示行所需的字节数。例如,对于8位像素,16像素的宽度意味着16 rowbytes。
我们还注意到png_ptr结构体的填充处理,这是一个基于堆的libpng数据结构,存放所有特定于PNG的数据。其中,包括各种函数指针,当libpng对我们的PNG数据进行操作时,将调用这些指针。例如,当libpng遇到错误时,它将调用png_error。
在[1]处我们看到,如果png_ptr结构体含有一个填充error_fn函数指针的字段,则调用该函数指针时会将png_ptr结构体本身作为其第一个参数传递。
从攻击者的角度来看,了解受影响的软件如何与可能被我们控制的内存进行交互是很重要的。在这种情况下,我们已经确定libpng使用了一个基于堆的结构体,它包含了函数指针,当错误发生时,这些指针会被调用。作为一种重定向执行的方法,这在我们的漏洞利用过程中可能会很有帮助,所以我们要注意这一点。
如果我们的漏洞利用过程需要破坏png_ptr结构体,那么它就是滥用应用程序特定堆数据的一个好例子。
长话短说,假设这里使用的是8位像素,我们可以控制直接通过图像宽度得出的行字节值。因此,为了触发png-img bug,我们只需要创建这样一个有效的PNG文件:该文件包含的高度和宽度将触发整数溢出,并提供足够的行数据来覆盖data_相邻的堆内存。
我们可以使用Python Pillow库快速地进行演示:
当我们使用png-img加载生成的png文件时,将发生崩溃:
我们看到,由于_dl_fixup对堆内存进行了操作,而这些堆内存被我们的行数据覆盖,而行数据由大量的A字节(0x41)组成,所以我们崩溃了。
由此看来,有一些关键的进程会涉及我们控制的堆数据,于是就有了后来的崩溃。我们看到,在_dl_fixup中,崩溃前最后调用的libpng函数是png_read_row。
如果您没忘记的话,我们最初的漏洞利用理论是,我们或许能够破坏堆上的png_ptr数据,然后触发一个bug,导致libpng调用我们提供给png_error的函数指针值——当它用完行数据时。但是,我们没有在png_error中崩溃,而是在_dl_fixup中崩溃了。
那么这是怎么回事呢?好吧,首先让我们确定png_read_row实际上是在尝试调用png_error。如果我们看一下png_read_row的反汇编输出,我们会注意到以下内容:
我们注意到,png_error是通过过程链接表(procedure linkage table)调用的。其中,第一个参数是通过RDI寄存器传递的png_ptr结构体指针,第二个参数是通过RSI寄存器传递的错误消息。下面,让我们在png_error@plt上设置断点,看看会发生什么。
到目前为止,一切都很好!我们确实在试图用受控的png_ptr数据调用png_error。但我们为什么会在_dl_fixup中崩溃,而不是获得函数指针控制权呢?
好吧,png_error是一个致命的错误处理程序。由于这是第一次调用png_error,由于惰性链接的缘故,它实际上还没有被解析和重定位。所以发生的情况是,过程链接表(PLT)中的指令会尝试跳转到png_error的全局偏移表(GOT)跳转槽条目中包含的地址,但这个地址正好指向png_error PLT条目,该条目中包含的指令负责调用动态链接器的运行时解析器。
我们可以单步跟踪这个过程,以便更好地理解它。
在这里,我们看到png_error@plt通过GOT跳转槽跳回PLT的方式调用解析器。链接器负责解析和修复png_error的GOT跳转槽,这样以后的调用就会直接进入png_error的正确位置。简单来说,这就是惰性链接(lazy linking)的工作原理。

png-img库使用惰性链接进行按需符号解析的事实也告诉我们,它只启用了部分重定位只读(RELRO)机制。还记得之前讲过的对Node.js二进制代码进行的安全检查吗?它已经启用了完全的RELRO机制。当完全启用RELRO时,给定二进制文件的GOT部分被标记为只读,以防止攻击者替换GOT中的函数指针值。完全RELRO意味着所有动态链接的函数都必须在二进制文件加载时由链接器解析和重新定位,因为已经无法在运行时更新GOT。这是出于性能方面的考虑,因此,我们经常会看到一些库代码因为这个原因而被编译成部分RELRO。
所以总结一下,我们的base node二进制文件并不是一个PIE,并已经启用了完全的RELRO,而我们的目标png-img库启用了部分RELRO。我们的堆溢出破坏了动态链接器用来解析png-img库的函数的内存,而且我们还覆盖了png-img捆绑的libpng代码使用的png_ptr应用的特定数据。我们注意到,png_ptr是作为第一个参数传递给这个尚未解析的png_error函数的。
到目前为止,有两条明显的漏洞利用途径。我们可以尝试触发获取链接器数据的堆布局,并执行劫持PNG_PTR函数指针的原始计划,也可以尝试破坏动态链接器解析器逻辑。
这就是事情变得有些不太确定的地方。我们的堆布局控制是基于我们提供给png-img的静态PNG文件的。我们可以将data_数组分配为图像宽度的倍数,因为该漏洞允许我们使用图像的宽度和高度来触发一个32位的整数溢出。
我们再来看看存在漏洞的代码。
在[1]处,data_将是通过整数溢出覆盖的长度,这意味着我们可以使用height的低位字使data_size成为rowbytes的任意倍数。例如,如果希望data_为8字节,则可以将rowbytes设置为8,将height设置为((0xFFFFFFFF/8)+1)+1=0x20000001。
这意味着我们可以通过相当精细的方式控制data_chunk的分配大小,从而合理地控制将其存放在堆中的位置。但是,在控制堆分配顺序方面,我们没有太多其他选择。如果我们能够更好的控制目标进程中内存的分配和释放的方式和时间,那么我们可能还可以考虑攻击系统分配器(glibc)本身。但是,考虑到我们受到缓解机制的诸多限制,如果对分配器没有足够的影响力的话,我们的PoC代码的可靠性将无法满足我们的最低要求。我们可以探索的一条途径是,利用其他PNG分块,以在触发内存破坏之前将堆“按摩”到一种有利的状态——如果我们的最初探索最终陷入僵局,我们将保留它作为一种选择。
作为开发人员,必须了解攻击者将根据他们愿意花在漏洞利用上面的资源和时间来探索漏洞。即使对于相对简单的漏洞(例如png-img堆溢出),我们也看到有一个独特的攻击评估方案在起作用,它权衡了针对这里的代码,各种攻击策略的优缺点。对于各种防御措施,要根据特定平台和具体目标这两种角度进行考察。
小结
在本文中,我们将深入地探讨,在通过外部函数接口(Foreign Function Interface,FFI)将基于C/C++的库“粘合”到解释语言的过程中,安全漏洞是如何产生的。由于篇幅过长,我们将分为多篇进行介绍,更多精彩内容敬请期待!
本文翻译自:
特仑苏牛奶是哪里的?
特仑苏”在蒙语中是“金牌牛奶”之意,也是蒙牛的一个牛奶品牌。 它的产地——中国乳都核心区和林格尔,依托北纬40度左右、中温带暖湿季风性气候、世界公认的优质奶源带等一系列得天独厚的优势自然条件,提供了市场稀缺的高品质奶源。 这里有蒙牛的澳亚国际牧场,有蒙牛的全球样板工厂,也有其全智能自动化控制中心与牛奶健康研究发展中心。 由于采用了国际先进的加工技术,最大程度保证牛奶中营养成分,“特仑苏”成品经过严格的检测,包含了丰富的天然优质乳蛋白,每100克牛奶中蛋白质含量可以达到3.3克,比国家标准高13.8%,其整体营养含量更是高于普通牛奶,而且口味更香、更浓、更滑。 而从产品定价看,因其品质高而产量有限,市场售价也是普通纯牛奶的2倍左右。 据了解,作为一种高端牛奶制品,特仑苏在保证普通牛奶健康营养特性的基础上,突出的高蛋白可以更好地维持人体正常的新陈代谢和各类物质在体内的输送,增强人体免疫力,保持人体内的酸碱平衡及水分的分布,对人体健康非常有益。
情感计算的“情感计算”的基本内容
人们期盼着能拥有并使用更为人性化和智能化的计算机。 在人机交互中,从人操作计算机,变为计算机辅助人;从人围着计算机转,变为计算机围着人转;计算机从认知型,变为直觉型。 显然,为实现这些转变,人机交互中的计算机应具有情感能力。 情感计算研究就是试图创建一种能感知、识别和理解人的情感,并能针对人的情感做出智能、灵敏、友好反应的计算系统。 情感被用来表示各种不同的内心体验(如情绪、心境和偏好),情绪被用来表示非常短暂但强烈的内心体验,而心境或状态则被用来描述强度低但持久的内心体验。 情感是人与环境之间某种关系的维持或改变,当客观事物或情境与人的需要和愿望符合时会引起人积极肯定的情感,而不符合时则会引起人消极否定的情感。 情感具有三种成分:⑴主观体验,即个体对不同情感状态的自我感受;⑵外部表现,即表情,在情感状态发生时身体各部分的动作量化形式。 表情包括面部表情(面部肌肉变化所组成的模式)、姿态表情(身体其他部分的表情动作)和语调表情(言语的声调、节奏、速度等方面的变化);⑶生理唤醒,即情感产生的生理反应,是一种生理的激活水平,具有不同的反应模式。 概括而言,情感的重要作用主要表现在四个方面:情感是人适应生存的心理工具,能激发心理活动和行为的动机,是心理活动的组织者,也是人际通信交流的重要手段。 从生物进化的角度我们可以把人的情绪分为基本情绪和复杂情绪。 基本情绪是先天的,具有独立的神经生理机制、内部体验和外部表现,以及不同的适应功能。 人有五种基本情绪,它们分别是当前目标取得进展时的快乐,自我保护的目标受到威胁时的焦虑,当前目标不能实现时的悲伤,当前目标受挫或遭遇阻碍时的愤怒,以及与味觉(味道)目标相违背的厌恶。 而复杂情绪则是由基本情绪的不同组合派生出来的。 情感测量包括对情感维度、表情和生理指标三种成分的测量。 例如,我们要确定一个人的焦虑水平,可以使用问卷测量其主观感受,通过记录和分析面部肌肉活动测量其面部表情,并用血压计测量血压,对血液样本进行化验,检测血液中肾上腺素水平等。 确定情感维度对情感测量有重要意义,因为只有确定了情感维度,才能对情感体验做出较为准确的评估。 情感维度具有两极性,例如,情感的激动性可分为激动和平静两极,激动指的是一种强烈的、外显的情感状态,而平静指的是一种平稳安静的情感状态。 心理学的情感维度理论认为,几个维度组成的空间包括了人类所有的情感。 但是,情感究竟是二维,三维,还是四维,研究者们并未达成共识。 情感的二维理论认为,情感有两个重要维度:⑴愉悦度(也有人提出用趋近-逃避来代替愉悦度);⑵激活度,即与情感状态相联系的机体能量的程度。 研究发现,惊反射可用做测量愉悦度的生理指标,而皮肤电反应可用做测量唤醒度的生理指标。 在人机交互研究中已使用过很多种生理指标,例如,皮质醇水平、心率、血压、呼吸、皮肤电活动、掌汗、瞳孔直径、事件相关电位、脑电EEG等。 生理指标的记录需要特定的设备和技术,在进行测量时,研究者有时很难分离各种混淆因素对所记录的生理指标的影响。 情感计算研究的内容包括三维空间中动态情感信息的实时获取与建模,基于多模态和动态时序特征的情感识别与理解,及其信息融合的理论与方法,情感的自动生成理论及面向多模态的情感表达,以及基于生理和行为特征的大规模动态情感数据资源库的建立等。 欧洲和美国的各大信息技术实验室正加紧进行情感计算系统的研究。 剑桥大学、麻省理工学院、飞利浦公司等通过实施“环境智能”、“环境识别”、“智能家庭”等科研项目来开辟这一领域。 例如,麻省理工学院媒体实验室的情感计算小组研制的情感计算系统,通过记录人面部表情的摄像机和连接在人身体上的生物传感器来收集数据,然后由一个“情感助理”来调节程序以识别人的情感。 如果你对电视讲座的一段内容表现出困惑,情感助理会重放该片段或者给予解释。 麻省理工学院“氧工程”的研究人员和比利时IMEC的一个工作小组认为,开发出一种整合各种应用技术的“瑞士军刀”可能是提供移动情感计算服务的关键。 而目前国内的情感计算研究重点在于,通过各种传感器获取由人的情感所引起的生理及行为特征信号,建立“情感模型”,从而创建个人情感计算系统。 研究内容主要包括脸部表情处理、情感计算建模方法、情感语音处理、姿态处理、情感分析、自然人机界面、情感机器人等。 情境化是人机交互研究中的新热点。 自然和谐的智能化的人机界面的沟通能力特征包括:⑴自然沟通:能看,能听,能说,能触摸;⑵主动沟通:有预期,会提问,并及时调整;⑶有效沟通:对情境的变化敏感,理解用户的情绪和意图,对不同用户、不同环境、不同任务给予不同反馈和支持。 而实现这些特征在很大程度上依赖于心理科学和认知科学对人的智能和情感研究所取得的新进展。 我们需要知道人是如何感知环境的,人会产生什么样的情感和意图,人如何做出恰当的反应,从而帮助计算机正确感知环境,理解用户的情感和意图,并做出合适反应。 因此,人机界面的“智能”不仅应有高的认知智力,也应有高的情绪智力,从而有效地解决人机交互中的情境感知问题、情感与意图的产生与理解问题,以及反应应对问题。 显然,情感交流是一个复杂的过程,不仅受时间、地点、环境、人物对象和经历的影响,而且有表情、语言、动作或身体的接触。 在人机交互中,计算机需要捕捉关键信息,觉察人的情感变化,形成预期,进行调整,并做出反应。 例如,通过对不同类型的用户建模(例如,操作方式、表情特点、态度喜好、认知风格、知识背景等),以识别用户的情感状态,利用有效的线索选择合适的用户模型(例如,根据可能的用户模型主动提供相应有效信息的预期),并以适合当前类型用户的方式呈现信息(例如,呈现方式、操作方式、与知识背景有关的决策支持等);在对当前的操作做出即时反馈的同时,还要对情感变化背后的意图形成新的预期,并激活相应的数据库,及时主动地提供用户需要的新信息。 情感计算是一个高度综合化的技术领域。 通过计算科学与心理科学、认知科学的结合,研究人与人交互、人与计算机交互过程中的情感特点,设计具有情感反馈的人机交互环境,将有可能实现人与计算机的情感交互。 迄今为止,有关研究已在人脸表情、姿态分析、语音的情感识别和表达方面取得了一定的进展。 目前情感计算研究面临的挑战仍是多方面的:⑴情感信息的获取与建模,例如,细致和准确的情感信息获取、描述及参数化建模,海量的情感数据资源库,多特征融合的情感计算理论模型;⑵情感识别与理解,例如,多模态的情感识别和理解;⑶情感表达,例如,多模态的情感表达(图像、语音、生理特征等),自然场景对生理和行为特征的影响;⑷自然和谐的人性化和智能化的人机交互的实现,例如,情感计算系统需要将大量广泛分布的数据整合,然后再以个性化的方式呈现给每个用户。 情感计算有广泛的应用前景。 计算机通过对人类的情感进行获取、分类、识别和响应,进而帮助使用者获得高效而又亲切的感觉,并有效减轻人们使用电脑的挫败感,甚至帮助人们理解自己和他人的情感世界。 计算机的情感化设计能帮助我们增加使用设备的安全性,使经验人性化,使计算机作为媒介进行学习的功能达到最佳化。 在信息检索中,通过情感分析的概念解析功能,可以提高智能信息检索的精度和效率。 展望现代科技的潜力,我们预期在未来的世界中将可能会充满运作良好、操作容易、甚至具有情感特点的计算机。
有什么动漫和犬夜叉类似?
《犬夜叉》和《鬼神童子》的相似点1、首先,这两部作品都是以男主角命名的。 2、男主角都是拥有超凡能力的非人类存在。 前鬼是鬼神,犬夜叉是妖怪。 (好吧,狗狗有一半是人类)3、男主角都有强烈的荣誉感,脾气都是一样的暴躁。 但粗暴归粗暴,他们又有着孩子气的一面。 4、女主角都是现代美少女,有一头美丽的漆黑长发。 性格都是活泼开朗,只是较之小明,戈薇更加温柔些。 5、女主角都是神社的女儿。 戈薇在日暮神社,小明在役咒法堂。 6、男主角都和一位已逝的法师有过过节,都被那位法师临死前封印。 犬夜叉和桔梗是两心相许的情侣,却因为奈落的诡计反目成仇。 前鬼殿下更是遭到役小角无情的束缚,鸟尽弓藏兔死狗烹的悲惨命运让人惋惜。 7、女主角都和这位已逝的法师有很深的渊源。 小明是小角法师的后裔,戈薇更传奇般的成为桔梗的转世和情敌。 8、男女主角都是经由妖怪的攻击,命运般地相会。 9、一开始,男主角都想杀死女主角。 虽然知道眼前的少女并非封印他的桔梗,为了得到四魂之玉,犬夜叉还是无情的攻击戈薇。 为了摆脱役家的役使,苏醒的前鬼不止一次的想要杀死小明。 10、女主角都得到一件咒力强大的法器,把男主角治得服服帖帖。 戈薇的言灵念珠,小明的护法手镯。 各位观众不止一次被戈薇的“坐下”逗得捧腹大笑了吧?11、故事中都有一种魔法物品,主角们的故事都围绕它来展开。 《犬夜叉》中,犬夜叉为了变成完全的妖怪而想得到四魂之玉,但四魂之玉在和妖怪的战斗中被戈薇不小心射成碎片。 两个人为了收集玉而走到一起。 《鬼神童子》中,继承祖先遗志的小明和凭依兽战斗,而凭依果(附混蛋)则是前鬼最喜欢的食物。 12、一开始,因为互相不了解,女主角都会戏耍男主角。 而随着战斗的继续,了解的深入,两个人的默契逐渐加深。 戈薇和犬夜叉在交往中成为情侣。 小明和前鬼在接连的战斗中彼此信任。 虽然小明喜欢前鬼显而易见,但前鬼对小明尚处于未知状态,战友、情侣,抑或是欢喜冤家?火影忍者浪客剑心鬼眼狂刀不思议游戏全职猎人乱马
发表评论