Haskell 中编译时参数的混淆值

Woj*_*Gac 0 security haskell decompiling dump template-haskell

在我的 Haskell 应用程序中,我实现了以下机制来将敏感信息传递到二进制文件(不诉诸 CLI 参数):

  • 我使用一种TemplateHaskell在编译时读取环境变量的机制:
{-# LANGUAGE TemplateHaskell #-}
...
import Language.Haskell.TH.Env
...
myPrecious :: String
myPrecious = fromMaybe "" $$(envQ "MY_PRECIOUS")
...
Run Code Online (Sandbox Code Playgroud)
  • 编译时,我像这样传递相关的环境变量:MY_PRECIOUS=<secret> stack build然后它绑定到myPreciousHaskell 端
  • 生成的二进制文件具有编译后的值,因此从操作系统级别(例如 via )MY_PRECIOUS看不到它ps aux

问题是,我现在可以在文本编辑器中打开该二进制文件或创建内存转储(例如使用 GDB),并通过一点决心挖掘秘密,特别是如果我知道它正在使用的上下文 - 我假设某些恶意行为者可能已经获得了源代码的访问权限。所以我一直想知道,是否有任何方法可以强制 GHC 生成更加混乱/乱码的二进制文件,其中这些值不容易可见。我知道没有这样的保护方案可以是万无一失的,但我正在寻找一种方法来使入侵者的任务变得更加困难。

Jos*_*ica 6

混淆完全是浪费时间。你最终会花上几天的时间试图想出一些聪明的东西,但菜鸟逆向工程师在几分钟内就能击败它。相反,您应该设置实际的安全性,而不是通过默默无闻的方式来设置安全性,如下所示:

  1. 创建一个新的 UNIX 组,其中没有用户
  2. 将您的秘密放入只有 root 和该组可读的文件中
  3. 对程序进行编码以在启动时从该文件读取机密
  4. 使您的二进制文件 setgid 成为可以读取该文件的组

现在,在文本编辑器中打开二进制文件将不会产生任何结果,因为秘密根本不在其中,并且不可能进行内存转储,因为内核不允许您对 setgid 进程执行此操作。

  • @WojciechGac 对运行您的程序的计算机具有 root 访问权限的人基本上可以完全访问所有内容;所有文件、所有程序、所有内存等。您无法通过尝试想出一种方法来阻止 root 访问秘密来防御该漏洞;这几乎是徒劳的。您可以通过首先保护 root 访问来防御该漏洞。 (3认同)