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_guard
和 stack_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 和保护外部节点导出器
Elastic Stack 8.0 安装 - 保护你的 Elastic Stack 现在比以往任何时候都简单