是否有人在试图检测注射时强化其代码?例如,如果某人试图通过NSUrlConnection拦截用户名/密码,他们可以使用LD_PRELOAD/DYLD_LIBRARY_PATH
,为我的NSUrlConnection调用提供导出,然后将调用转发给真正的NSUrlConnection。
阿里在下面提供了很好的信息,但我正在努力确定应该对恶劣的环境采取什么措施,这可能会导致手机被囚禁。大多数应用程序不必关心,但是一类应用程序可以做到 - 高完整性软件。
如果您正在强化,您使用的是哪种方法?有没有一种标准的方法来检测Mac和iPhone上的注射?你是如何打败框架注射的呢?
答案 0 :(得分:1)
对于iOS / CocoaTouch,不允许加载动态库*(系统框架除外)。要通过AppStore构建和分发应用程序,您只能链接静态库和系统框架,没有动态库。
所以在iOS上你不能用它来代码注入,当然你也不能使用LD_PRELOAD
(因为你在iOS上无权访问这样的环境变量)。
除了越狱的iPhone之外,但越狱的人应该认识到,越狱的定义是提升iOS提供的所有证券以避免注入等事情(所以你不能指望取消锁定你的门,以避免使用你的钥匙...仍然期望你仍然可以防止小偷抢劫你的房子; - ))
这就是iOS上的沙盒+ CodeSigning +没有dylib约束的优势。没有代码注入。
(在OSX上仍然可能,特别是使用LD_PRELOAD)
[编辑]从iOS8开始,iOS也允许动态框架。但是,由于它仍然是沙箱(您只能加载应用程序包内部的代码签名框架,并且无法加载来自应用程序包外部的框架)注入仍然不可能*
*除非用户越狱手机,但这意味着他/她选择摆脱所有保护和目的,从而使手机处于危险之中 - 我们无法破解我们的手机安全性,仍然期望它提供证券提供的所有保护
答案 1 :(得分:0)
这是针对UNIX操作系统的特定答案,如果对您的问题没有意义,我很抱歉,但我不太了解您的平台。只是不要创建动态链接的可执行文件。
我可以通过两种方式来做到这一点。方法#2可能最适合你。他们都很相似。
两者的 重要,可执行文件必须在构建时使用-static
进行静态编译
通过完整路径手动dlopen
每个库,然后在运行时通过dlsym
获取函数地址,并将它们分配给函数指针以使用它们。您需要为要使用的每个外部函数执行此操作。我认为重入的不安全函数不会喜欢这样,所以对于那些使用静态变量的人 - 你需要使用可重入的安全版本,这些版本以“_r”结尾,即使用strtok_r
代替strtok
< / p>
这将是困难或简单的,具体取决于您的应用程序的功能以及您正在使用的功能。
您可以通过链接静态可执行文件来解决您的subversion问题,以避免使用动态库。这将生成比dlopen()/dlsym()
方法大得多的exe。使用-static
编译标志构建而不是使用,例如gcc bah.c -o bah lssl
使用gcc -static bah.c -o bah /usr/lib/libssl.a
来使用您需要的静态编译版本的库而不是动态共享库。换句话说,在构建
-static
并且不要使用-l
对于任何一种方法:
file bah
确认可执行文件是静态链接的。或者通过在其上运行ldd
确认.a
而不是.so
)dlopen()/dlsym()
方法,则不会出现此问题,但如果符号在不同版本中发生更改,则会出现可移植性问题根据您的需要,每种方法都有其优缺点。
采用方法1 dlopen
和dlsym
方法会使您的代码更加“模糊”和更小,但在大多数情况下会牺牲可移植性,因此可能不是您想要的。好处是,当安全漏洞在系统范围内固定时,它可能会受益。