【问题标题】:How to allocate seperate memory to store confidential data?如何分配单独的内存来存储机密数据?
【发布时间】:2016-05-07 17:44:04
【问题描述】:

我想知道,是否可以在某个库中分配一个单独的内存区域,这样使用该库的应用程序就无法直接访问它。

假设这个库公开了一个需要机密数据才能运行的类。例如以下类,该类的实例包含机密访问令牌,这将允许恶意用户无需登录即可访问数据库。

class Session {
public:
  Session(const Database *database, const std::string& name) : username(name), login_expires(-1), db(database) {}
  virtual ~Session(){}

  bool renew_login(const std::string& password);
private:
  const Database* db;
  long login_exiration_date;

  // confidential data:
  std::string username;      
  char confidental_accesstoken[128];
};

当我有一个名为 s 的 Session 实例时,用户当前已在其中登录,我只需将 &s 转换为字符指针即可提取访问令牌。

现在我想将这个类重新实现为以下类:

class Session {
public:
  Session(const Database *database, const std::string& name) : username(name), login_expires(-1), db(database) {}
  virtual ~Session(){}

  bool renew_login(const std::string& password);
private:
  const Database* db;
  long login_exiration_date;

  long some_temporary_id;
};

如果像这样声明 Session 类,终端应用程序将无法再访问机密数据,因为它不再存储在会话实例本身中。


问题:

我必须以这样一种方式存储机密数据,使其不能在最终应用程序中简单地通过使用指针算法进行访问。

我知道,我无法以 root 用户无法将所有内存转储到磁盘并搜索它的方式保护数据,但这不是我想要实现的目标。

我想在我的库中拥有一个私有内存空间,这样具有普通访问权限的普通用户空间应用程序必须使用我的界面才能使用这些受限资源。

有没有办法做到这一点?

【问题讨论】:

  • 您需要一个单独的进程来保存数据。根据定义,在同一进程中运行的任何代码都会看到相同的地址空间。
  • 使用单独的进程,您可以在其中选择mlock您的安全内存,以防止它被交换到磁盘。这就是像 gnupg 这样的安全软件所做的。

标签: c++ linux


【解决方案1】:

我不相信您有任何机会以无法被同一进程中的其他功能访问的方式存储数据。您可以通过将数据存储在某个 file/thread_local 变量中来使其更难,但同样,这只会隐藏数据,而不是保护它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    相关资源
    最近更新 更多