【问题标题】:Buffer overflow vulnerability in DelphiDelphi中的缓冲区溢出漏洞
【发布时间】:2021-01-07 23:35:12
【问题描述】:

我很想知道,Delphi 是否容易受到缓冲区溢出攻击?我读了一些页面,其中提到 Delphi 对那个 vuln 是安全的,因为“Delphi 可以使用 Pascal 字符串以及通用 Windows 字符串 (PChar)。当与 Win API 交互时,除了使用 Pchar 之外没有其他选择”。 真的吗? 谢谢

【问题讨论】:

  • 你应该找到一个更好的网站来学习 Delphi。不,我们不能为您推荐一个,因为这违反了本网站的准则。

标签: security delphi buffer-overflow


【解决方案1】:

Delphi 容易受到缓冲区溢出攻击吗?

大多数语言都容易受到缓冲区溢出攻击。缓冲区溢出是编码错误,而不是语言缺陷。例如,在 Delphi 中:

var
  buf: array[0..0] of Byte;
  i: Integer;
begin
  Move(buf, i, sizeof(i)); // buffer overflow!
  PInteger(@buf)^ := i;    // buffer overflow!
end;

如果你不小心的话,大多数语言会让你在脚下开枪。编译器能做的只有这么多。并非所有事情都可以在编译时避免。编程不仅仅是编写可编译的代码,还要编写在运行时正确且负责任地运行的代码。

某些语言可能会以在运行时执行边界检查的方式包装缓冲区,从而降低缓冲区溢出的风险。 Delphi 不是其中一种语言,因为它允许您直接在原始内存上进行操作,因此您几乎可以做任何您想做的事情(好吧,不管底层操作系统允许您做什么)。这对于 Pascal 字符串来说当然是正确的。

我阅读了一些页面,其中提到 Delphi 对于该漏洞是安全的,因为“Delphi 可以使用 Pascal 字符串以及通用 Windows 字符串 (PChar)。

Delphi 没有避免所有可能的缓冲区溢出的功能。但是,如果您编写代码以正确且合理地使用缓冲区,则不太可能发生溢出。这也不仅限于字符串。

当与 Win API 接口时,除了使用 Pchar 之外没有其他选择。是真的吗?

这取决于特定的 API。大多数使用简单的以空结尾的PChar 字符串,是的。但是有些使用UNICODE_STRING 记录代替,这些记录使用不保证以空值终止的WideChar 缓冲区。有些使用 ActiveX/COM BSTR (Delphi WideString) 字符串代替。

【讨论】:

  • 谢谢。我主要关心的是在 Delphi 语言中打开“控制流保护 (CFG)”标志。我有一个 .exe 应用程序,我想为此打开 CFG。创建此标志是为了应对内存损坏漏洞。
  • @hanahosseinabadi AFAIK,Delphi 目前不支持 CFG。即使这样做了,CFG 也仅用于阻止来自非法来源的函数的执行。缓冲区溢出可用于此,但不是唯一的方法。而且 CFG 本身并不能防止缓冲区溢出,这可能会导致其他问题,而不仅仅是非法函数调用。
【解决方案2】:

德尔福作为 IDE?也许。作为语言?当然。自己判断:

var
  s: String;
  i: Integer;
begin
  s:= 'four';  // Length of string: 4 characters
  for i:= 1 to 1138 do begin  // This loop goes WAY beyond the String's buffer
    write( s[i] );  // What will it access after i=4?
  end;
end;

PChar 是必需的,因为 WinAPI 不是为 Pascal 构建的,但 Pascal 需要为 API 弯曲。缓冲区溢出是个问题,但它不像PChar 是放射性的,String 是耶稣——这取决于程序员不要过于愚蠢。

【讨论】:

    【解决方案3】:

    缓冲区溢出攻击与任何特定语言无关。只有当开发人员错误地编码了他的应用程序时,这些攻击才有可能发生。

    简而言之,当使用外部数据写入内存时,您作为开发人员有责任编写所有测试。编写时必须始终检查数据长度是否正确。

    对于 Delphi,有一些工具可以帮助检测缓冲区溢出(或下溢和许多其他错误)。例如madExcept。此工具不会防止缓冲区溢出,如果您的程序溢出动态分配的缓冲区,它将立即。这是一个测试工具,不应在发布版本中提供。

    【讨论】:

    • 是和不是。 Delphi 程序中的大部分代码都是 rtl/vcl 代码,不受开发人员的控制
    • 在将数据移入/移出 rtl/vcl/library/component 代码之前,开发人员有责任检查有效性以避免任何缓冲区溢出和其他类型的错误。开发人员还应该查看 rtl/vcl 源代码,以了解该代码如何容易受到任何攻击。开发安全的应用程序可能既复杂又耗时。
    猜你喜欢
    • 2016-06-04
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    相关资源
    最近更新 更多