何时以及如何使用GCC的堆栈保护功能?(When and how to use GCC's

2019-09-01 11:29发布

我已经启用了-Wstack-protector编译我的工作项目(商业多平台的C ++游戏引擎,编译在Mac OS X 10.6与GCC 4.2)时发出警告。 此标志发出警告,将不会对堆栈即使砸的保护功能-fstack-protector已启用。 GCC建设项目时,发出一些警告:

没有保护功能:无需缓冲至少8个字节长
没有保护局部变量:可变长度的缓冲区

对于第一个警告,我发现它是能够调整的最小尺寸在一功能使用时的缓冲器必须有,该功能所针对堆叠被保护粉碎: --param ssp-buffer-size=X ,可以使用其中X为8默认并且可以低至1。

对于第二个警告,除非停止使用我无法抑制其发生-Wstack-protector

  1. 当应-fstack-protector一起使用? (如在,例如,所有的时间开发过程中,跟踪错误关闭或只是什么时候?)
  2. 当应-fstack-protector-all可以用吗?
  3. 什么是-Wstack-protector告诉我? 难道是暗示我减少缓冲区最小尺寸?
  4. 如果是这样,是否有任何缺点,以把尺寸为1?
  5. 看来, -Wstack-protector ,如果你想要一个无警告的构建是不是那种你想在任何时候都启用标志。 这是正确的吗?

Answer 1:

堆栈保护是一种硬化的策略,而不是一个调试策略。 如果你的游戏是网络感知或以其他方式数据从非控制源的到来,将其打开。 如果没有数据从什么地方来不受控制,不打开它。

下面是它如何发挥出来:如果你有一个bug,并根据一些攻击者可以控制的缓冲区变化,即攻击者可以覆盖返回地址或堆栈的相似部分以使其执行自己的代码,而不是你的代码。 如果检测到这种情况的发生堆栈保护将中止你的程序。 您的用户不会高兴,但他们也不会被黑客攻击。 这是不是那种黑客攻击的是关于游戏中作弊,这是那种黑客是如何使用代码中的漏洞创建一个利用潜在感染用户某人。

对于面向调试解决方案,看东西像挡泥板。

关于你提到的具体问题:

  1. 如果你从不受控制的来源的数据使用堆栈保护。 这个问题的答案或许是肯定的。 所以用它。 即使你没有不受控制的来源的数据,你可能最终会或者已经做的,没有意识到这一点。
  2. 在所有缓冲区堆栈保护可以,如果你想交换一些性能损失额外的保护中。 从gcc4.4.2手册 :

    -fstack保护器

    发出额外的代码来检查缓冲区溢出,如堆栈溢出攻击。 这是通过添加一个保护变量与弱势对象的功能来完成。 这包括调用alloca函数,并用大于8个字节的缓冲器的功能。 进入功能时,卫兵被初始化,然后检查当函数退出。 如果保护检查失败,错误消息被打印,并且程序退出。

    -fstack保护器,所有

    像除了所有功能保护-fstack保护器。

  3. 该警告告诉你什么缓冲堆栈保护不能保护。

  4. 这不一定表明您减少最小缓冲区大小,并在大小的0/1,这是一样的堆栈保护-所有。 它只是它指向了你,让你可以,如果你决定重新设计代码,以便缓冲保护。
  5. 不,这些警告并不代表问题,他们只是指出信息给你。 不经常使用它们。


Answer 2:

事实上,你不应该在乎警告正常的基础之上。 这真是一个多信息的消息。 我希望这是显而易见的,你确实有在堆栈上的可变大小的缓冲区固有的安全问题; 得到尺寸计算错了,你打开一个大洞。



文章来源: When and how to use GCC's stack protection feature?