Haskell 中编译时参数的混淆值

问题描述 投票:0回答:1

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

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

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

security haskell dump decompiling template-haskell
1个回答
1
投票

混淆完全是浪费时间。您最终会花费数天的时间尝试想出一些聪明的东西,但菜鸟逆向工程师只能在几分钟内击败它。相反,您应该设置实际的安全性而不是通过默默无闻的安全性,像这样:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.