Swift和Stack粉碎保护

时间:2016-07-25 10:09:20

标签: ios swift xcode security

如何在纯swift应用程序中启用Stack Smashing Protection?

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

要验证构建我正在使用otool -Iv AppBinary | grep stack

3 个答案:

答案 0 :(得分:6)

在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

答案 1 :(得分:1)

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

每当我将-fstack-protector-all添加到“ Other C-Flags”构建设置中时,标志就不会按照其他注释中的描述显示在二进制文件中。

image showing chunk of file

我所做的是创建一个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()
...
}

此后,标志按照说明出现。

答案 2 :(得分:0)

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

对于快速应用程序,此处不涉及GCC编译器。而是具有不同选项和设置的swiftc编译器。 las,我不知道后者的类似选择。

按照@btype的建议在项目中添加一个Objective-c类,对您的快速源代码无济于事,因为它只会影响Obj-C和C代码。 但是,如果您使用用Obj-C编写的第三方库,那么它仍然是一个有价值的设置。但是请确保,如果将第三方库嵌入为单独的目标,则在正确的目标上设置此标志。

干杯,克里斯