检查ntpd可执行文件的有效性以防止篡改时间敏感信息

时间:2016-08-13 16:33:13

标签: c++ ntpd

我正在编写一段C ++代码,该代码将保存加密存档的访问密钥,并且不允许在Linux系统上的特定日期之前查看它。

完整的代码如下(是的,它很难看并且有一个system()电话。我觉得这对于给定的情况是必要的):

#include <iostream> //cout
#include <ctime> //time_t, time()
#include <cstdlib> //system()
#include <unistd.h> //getuid()
using namespace std;

int main () { 
        //updates the system clock and catches the exit code; must be 0 to proceed
        int tcheck = system ("ntpd -q -I pool.ntp.org");
        //checks updated time against set timestamp (11/20/16 @ 12 PM) and gives or denies access to key respectively
        if ((tcheck  == 0) && (getuid() = 0)) {
                time_t now = time(0);
                if (now < 1479661235)
                {cout << "It is not yet time.";}
                else
                {cout << "The key is: a placeholder";}
        }
        else if (getuid() != 0)
        {cout << "This program must be run as root.";}
        else if (tcheck != 0)
        {cout << "I think you might be cheating. Let the time server sync and then we'll talk.";}
        cin.get();
        return 0;
}

我的问题如下。具有sudo权限的用户(只有手头的可执行文件)必须无法访问密钥,但这样的用户只需删除/bin/ntpd并将其替换为虚拟程序就相对容易了。在被叫时返回0,从而规避时间篡改保护。

我考虑使用校验和来确保程序的有效性,但基于以下事实丢弃了这一点:临时中对ntp软件包的更新也可能会更改ntpd并使密钥无法访问。我也不能从包管理器中调用ntpd的校验和,因为代码必须可以在多个发行版中移植。

对于如何确保程序的有效性(或完全不同的方法来完成相同的结果),你们是否有任何想法?

PS:在你提到它之前,我确实计划对源进行模糊处理以避免反编译器利用,所以这不会成为一个问题。

1 个答案:

答案 0 :(得分:0)

鉴于网络必须始终可用以使用该程序,请将所有安全性移至服务器。在客户端,你只需要像

那样的东西
wget https://www.yourserver.com/getkey?keyid=xxxxxxxxxxxxxxxxxxxxx

keyid的参数是所需密钥的某个标识符(也许它的SHA1有一些秘密,但无论如何);然后,只有到时候,您的服务器才会提供所需的密钥。