研究人员在 Delphi 编程语言中发现了严重的内存损坏漏洞,这对人们普遍认为 Delphi 具备内在内存安全保护机制的观点提出了挑战。
这些发现凸显了重大安全风险,可能导致受影响软件出现应用程序崩溃、数据泄露,甚至远程代码执行。
这些漏洞具体涉及 Delphi 处理内存管理的方式,尤其是在数组、字符串和对象分配方面。
Delphi 是 Object Pascal 的一种方言,最初由 Borland 开发,现由 Embarcadero Technologies 维护,数十年来在企业软件开发中得到广泛应用。
美国国家安全局(NSA)在 2023 年一篇关于软件内存安全的论文中,曾将 Delphi 列为 “内存安全” 语言之一,不过也指出了某些不安全函数存在的问题。
Include Security 的分析师发现,尽管 Delphi 素有安全之名,但当遵循某些编码模式时,其代码和 C/C++ 一样容易出现内存损坏问题。
他们的研究表明,在 Delphi 中看似无害的编程错误如何能导致可被利用的安全漏洞,即便启用了一些安全机制。
研究团队构建了多个概念验证示例来展示这些漏洞,重点关注基于栈和堆的损坏情况。
他们的研究结果显示,虽然调试版本可能通过范围检查捕获一些问题,但使用默认编译器设置的发布版本可能存在严重的安全隐患。
内存损坏
研究人员给出的一个示例展示了一个简单的基于栈的缓冲区溢出情况。当禁用范围检查时,试图在固定长度数组边界之外写入数据,可能会破坏栈上的返回地址:
procedure Overflow1;var
ar: Array[0..9] of Byte; // 栈上的固定长度数组
i: Integer;begin
for i := 0 to 999 do
begin
ar[i] := $41; // 尝试使数组溢出
end;end; // 如果发生溢出,返回值为$41414141
当使用默认设置以发布模式编译这段代码时,它会使栈缓冲区溢出并破坏返回地址(来源 – Include Security)
研究人员还展示了某些系统函数,如 Move、FillChar、BlockRead 和 BlockWrite,即使在启用数组边界检查的情况下,也能绕过检查。
在另一个示例中,他们展示了在处理对象生命周期不当的情况下,如何出现基于堆的 “释放后使用” 漏洞:
obj1 := TMyFirstClass.Create; // 创建obj1
obj1.Free; // 释放obj1
obj2 := TMySecondClass.Create; // 创建obj2(占用相同内存)
obj1.ar[4] := $41; // 在obj1被释放后对其写入,从而修改obj2
这项研究有力地提醒开发者,在没有正确的实践和编译器设置的情况下,不能假定任何一种语言都能提供完全的内存安全。
发表评论
您还未登录,请先登录。
登录