微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Delphi 中的缓冲区溢出漏洞

如何解决Delphi 中的缓冲区溢出漏洞

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

解决方法

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 作为 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 是耶稣 - 这取决于程序员不要过于愚蠢。

,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。