Swift 和 Stack 粉碎保护

Posted

技术标签:

【中文标题】Swift 和 Stack 粉碎保护【英文标题】:Swift and Stack smashing protection 【发布时间】:2016-11-28 15:05:20 【问题描述】:

如何在纯 swift 应用程序中启用堆栈粉碎保护?

我确实尝试在 xCode 的项目构建设置选项卡下将“-fstack-protector-all”标志放入其他 C++ 标志,但似乎该标志未使用或对构建的应用程序没有影响。

为了验证构建,我使用的是otool -Iv AppBinary | grep stack

【问题讨论】:

你得到这个问题的答案了吗 没有。我没有。为了满足客户的要求,我将 UIView 添加为 Objective-C 类。这为objective-c创建了伞头文件,并且项目被编译为混合的Swift-Obj-c项目(不是纯swift项目)。这个视图没有使用任何软件......它只是。 感谢您的意见... 查看我的回答,希望对您有所帮助 我和你做了同样的事情——一个 C 标志设置。我使用radare2 的工具集来验证它是否已启用。 rabin2 -I <exec file NOT app bundle>| grep -E 'pic|bits|arch|canary' btw - 当我编写一个小型 C 应用程序来证明这是有效的时,我只创建了一个 Struct。这里面没有字符数组。在这种情况下,即使启用了 Smashing Smashing,您也会在 asm 代码中看到零堆栈保护代码。 【参考方案1】:

在 Swift 中,堆栈粉碎默认启用,只需在 Objective-C 应用程序的构建设置下添加“-fstack-protector-all”标志。

如何检查堆栈粉碎是否启用。 运行 otool 命令,stack_chk_guardstack_chk_fail 的存在表示代码受到堆栈粉碎保护。

$ otool -Iv <appname>|grep stack
0x0013dfg   520 ___stack_chk_fail
0x001d009   521 ___stack_chk_guard
0x001fd345   520 ___stack_chk_fail
0x000000010087efd   513 ___stack_chk_fail
0x0000000100098hf3 514 ___stack_chk_guard
0x00000001000897gfr   513 ___stack_chk_fail

【讨论】:

我使用临时签名导出了 ipa。我抓住其中的二进制文件。我运行了 otool,结果很好地显示出来。但这不会发生在使用应用商店签名的 ipa 上。正常吗? 在构建设置中我们必须设置“-fstack-protector-all”的确切位置 默认情况下没有看到它启用。在 XCode 中创建了单视图模板应用程序,构建并导出了 ad hoc,并且没有堆栈保护标志【参考方案2】:

我在 100% Swift 项目中也遇到过这个问题。

每当我将 -fstack-protector-all 添加到“其他 C 标志”构建设置时,标志都不会像其他 cmets 中所述那样显示在二进制文件中。

我所做的是创建一个 Objective-C 类……

// DummyClassForSSP.h
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface DummyClassForSSP : NSObject
+ (void)dummyCallSoFlagsShowUpInIPA;
@end

NS_ASSUME_NONNULL_END

…添加了一个虚拟实现…

// DummyClassForSSP.m
#import "DummyClassForSSP.h"

@implementation DummyClassForSSP

+ (void)dummyCallSoFlagsShowUpInIPA 

@end

…并从我的 AppDelegate 中调用它。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
....
DummyClassForSSP.dummyCallSoFlagsShowUpInIPA()
...

之后,标志就如所描述的那样出现了。

【讨论】:

这个解决方案也对我有用,但我有一个问题,为什么这里需要 Objective-C 类,以及为什么没有 Objective-C 类就不能工作?【参考方案3】:

聚会有点晚,但可能有助于其他人寻求建议: 乔的回答不正确。 -fstack-protector-all 是 GCC 编译器上的标志。 (此处的文档:https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html

对于 swift 应用程序,此处不涉及 GCC 编译器。相反,它是具有不同选项和设置的 swiftc 编译器。唉,我不知道后一种的可比选择。

按照@btype 的建议,在项目中添加一个objective-c 类对您的swift 源代码没有帮助,因为它只影响Obj-C 和C 代码。 但是,如果您使用用 Obj-C 编写的 3rd 方库,它仍然是一个有价值的设置。但请确保,如果 3rd 方库作为单独的目标嵌入,则将此标志设置在正确的目标上。

干杯,克里斯

【讨论】:

“你在正确的目标上设置了这个标志”你拿的标志是什么?我们需要在哪里设置标志?请解释位细节和屏幕截图改善答案以获得更多支持 @ArshadShaik 你得到了我们需要设置标志的解决方案吗?

以上是关于Swift 和 Stack 粉碎保护的主要内容,如果未能解决你的问题,请参考以下文章

如何为使用 Xamarin 构建的 iOS 应用启用堆栈粉碎保护?

Kube-Prometheus-Stack 和保护外部节点导出器

7个用于加密和保护U盘数据的工具

Elastic Stack 8.0 安装 - 保护你的 Elastic Stack 现在比以往任何时候都简单

Elastic Stack 8.0 安装 - 保护你的 Elastic Stack 现在比以往任何时候都简单

如何在 swift 中声明一个“受保护”变量