Я пишу часть кода C++, которая будет хранить ключ доступа к зашифрованному архиву и не разрешать его просматривать до определенной даты в системе Linux.Проверка работоспособности ntpd исполняемого файла для защиты от несанкционированного доступа info info
Полный код ниже (да, это некрасиво и имеет 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 возвращала 0, тем самым обходя защита от несанкционированного доступа.
Я рассматривал использование контрольной суммы для обеспечения достоверности программы, но отбросил ее на основании того факта, что обновление пакета ntp в промежуточный период также может изменить ntpd и сделать ключ недоступным. Я также не могу вызвать контрольную сумму для ntpd из диспетчера пакетов, потому что код должен быть переносимым через несколько распределений.
Есть ли у вас какие-либо идеи относительно того, как еще нужно обеспечить правильность программы (или совершенно разные методы для достижения того же результата)?
PS: Прежде чем вы упомянули об этом, я планирую обфускать источник, чтобы избежать использования декомпилятора, так что это не будет проблемой.
«Ключ должен быть недоступен для пользователя с привилегиями sudo (только с исполняемым файлом)« вы уже потеряли. –
Статически свяжите необходимый код 'ntp' в своем исполняемом файле. Даже с лучшими методами обфускации кто-то, кто достаточно мотивирован, сможет извлечь ключ. – OregonTrail
@OregonTrail: на самом деле, если бы я был взломан, я бы просто отслеживал сетевой трафик, замечал запрос на 'pool.ntp.org' и увлекал его (пользовательские'/etc/hosts', 'LD_PRELOAD' с обманным DNS разрешение каких-либо функций) на мой частный экземпляр ntp, выдавая любое время, которое я предпочитаю. –