2012-09-05 105 views
4

是否有人试图检测注入来强化他们的代码?例如,如果有人试图通过NSUrlConnection拦截用户名/密码,他们可以使用LD_PRELOAD/DYLD_LIBRARY_PATH,为我的呼叫提供导出到NSUrlConnection,然后将呼叫转发到真正的NSUrlConnection。如何打破框架注入?

阿里在下面提供了很好的信息,但我正在试图确定应该采取什么措施来应对恶劣环境,手机可能会被监禁。大多数应用程序不需要关心,但是一类应用程序也可以 - 高完整性软件。

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

回答

1

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

因此,在iOS中,您不能将其用于代码注入,当然也不能使用LD_PRELOAD(因为您无法在iOS上访问此类环境变量)。

除了越狱iPhone可能,但越狱他们的iPhone的人应该承担越狱,根据定义取消iOS提供的所有证券,以避免注入等事情(所以你不能指望取消你的锁门,以避免必须使用你的钥匙......并仍然期望你仍然不受盗贼抢劫的危害;-))

这就是Sandboxing + CodeSigning + iOS上没有dylib限制的优点。无法执行代码注入。

(在OSX它仍然是可能的,无论如何,使用inparticular LD_PRELOAD)


[编辑]由于iOS8上,监督办公室还允许动态的框架。但由于这仍然是沙盒(您只能加载应用程序包内的代码签名框架,并且无法加载来自应用程序包外部的框架)注入仍然不可能*

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

+0

谢谢阿里。我应该更具体。我正在看Jailbroken设备(我已经看到了注入库 - 我有源代码)。所以这个想法是在恶劣的环境中强化可执行文件。 – jww

+0

噢!不要那么做! – AliSoftware

+0

但ios 8允许框架... – uchuugaka

0

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

我可以通过两种方式来做到这一点。方法#2可能对你最好。他们都是相似的。

重要两者,可执行必须在生成时使用-static被静态编译

  1. 方法1 - 静态EXE,手动负载共享库可以通过受信任的完整路径

通过完整路径手动输入每个库,然后在运行时通过dlsym获取函数地址,并将它们分配给函数指针以使用它们。你需要为你想要使用的每个外部功能做到这一点。我相信折返不安全的功能将不喜欢这个所以对于那些使用静态变量 - 你需要使用重入安全的版本,这些最终以“_r”,即使用strtok_r代替strtok

这将是困难的或取决于你的应用程序的功能以及使用的功能。

  • 方法2 - 静态链接可执行文件,周期
  • 您可以通过链接只是一个静态的可执行文件,以避免使用动态库在所有解决您的颠覆问题。这将产生比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. 另请注意,升级系统库不会更新您的可执行文件。如果OpenSSL中存在新的安全错误,则需要获取最新的libssl.a并重新编译它。如果您使用dlopen()/dlsym()方法,你不会有这个问题,但你将有便携性的问题,如果符号在不同版本

    每种方法都有其优点和缺点根据您的需求而改变。

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