如何打败框架注入?

时间:2012-09-05 18:33:15

标签: cocoa cocoa-touch code-injection ld-preload

是否有人在试图检测注射时强化其代码?例如,如果某人试图通过NSUrlConnection拦截用户名/密码,他们可以使用LD_PRELOAD/DYLD_LIBRARY_PATH,为我的NSUrlConnection调用提供导出,然后将调用转发给真正的NSUrlConnection。

阿里在下面提供了很好的信息,但我正在努力确定应该对恶劣的环境采取什么措施,这可能会导致手机被囚禁。大多数应用程序不必关心,但是一类应用程序可以做到 - 高完整性软件。

如果您正在强化,您使用的是哪种方法?有没有一种标准的方法来检测Mac和iPhone上的注射?你是如何打败框架注射的呢?

2 个答案:

答案 0 :(得分:1)

对于iOS / CocoaTouch,不允许加载动态库*(系统框架除外)。要通过AppStore构建和分发应用程序,您只能链接静态库和系统框架,没有动态库。

所以在iOS上你不能用它来代码注入,当然你也不能使用LD_PRELOAD(因为你在iOS上无权访问这样的环境变量)。

除了越狱的iPhone之外,但越狱的人应该认识到,越狱的定义是提升iOS提供的所有证券以避免注入等事情(所以你不能指望取消锁定你的门,以避免使用你的钥匙...仍然期望你仍然可以防止小偷抢劫你的房子; - ))

这就是iOS上的沙盒+ CodeSigning +没有dylib约束的优势。没有代码注入。

(在OSX上仍然可能,特别是使用LD_PRELOAD)


[编辑]从iOS8开始,iOS也允许动态框架。但是,由于它仍然是沙箱(您只能加载应用程序包内部的代码签名框架,并且无法加载来自应用程序包外部的框架)注入仍然不可能*

*除非用户越狱手机,但这意味着他/她选择摆脱所有保护和目的,从而使手机处于危险之中 - 我们无法破解我们的手机安全性,仍然期望它提供证券提供的所有保护

答案 1 :(得分:0)

这是针对UNIX操作系统的特定答案,如果对您的问题没有意义,我很抱歉,但我不太了解您的平台。只是不要创建动态链接的可执行文件。

我可以通过两种方式来做到这一点。方法#2可能最适合你。他们都很相似。

两者的

重要,可执行文件必须在构建时使用-static进行静态编译

  1. 方法1 - 静态exe,通过其可信完整路径手动加载共享库
  2. 通过完整路径手动dlopen每个库,然后在运行时通过dlsym获取函数地址,并将它们分配给函数指针以使用它们。您需要为要使用的每个外部函数执行此操作。我认为重入的不安全函数不会喜欢这样,所以对于那些使用静态变量的人 - 你需要使用可重入的安全版本,这些版本以“_r”结尾,即使用strtok_r代替strtok < / p>

    这将是困难或简单的,具体取决于您的应用程序的功能以及您正在使用的功能。

    1. 方法2 - 静态链接可执行文件,期间
    2. 您可以通过链接静态可执行文件来解决您的subversion问题,以避免使用动态库。这将生成比dlopen()/dlsym()方法大得多的exe。使用-static编译标志构建而不是使用,例如gcc bah.c -o bah lssl使用gcc -static bah.c -o bah /usr/lib/libssl.a来使用您需要的静态编译版本的库而不是动态共享库。换句话说,在构建

      时使用-static并且不要使用-l

      对于任何一种方法:

      1. 构建完成后,使用file bah确认可执行文件是静态链接的。或者通过在其上运行ldd确认
      2. 请注意,您需要系统中存在的所有库的静态编译版本。这些文件以.a而不是.so
      3. 结尾
      4. 另请注意,升级系统库不会更新您的可执行文件。如果OpenSSL中存在新的安全漏洞,您需要获取最新的libssl.a并重新编译它。如果您使用dlopen()/dlsym()方法,则不会出现此问题,但如果符号在不同版本中发生更改,则会出现可移植性问题
      5. 根据您的需要,每种方法都有其优缺点。

        采用方法1 dlopendlsym方法会使您的代码更加“模糊”和更小,但在大多数情况下会牺牲可移植性,因此可能不是您想要的。好处是,当安全漏洞在系统范围内固定时,它可能会受益。