2016-08-13 10 views
-2

Я пишу часть кода 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: Прежде чем вы упомянули об этом, я планирую обфускать источник, чтобы избежать использования декомпилятора, так что это не будет проблемой.

+0

«Ключ должен быть недоступен для пользователя с привилегиями sudo (только с исполняемым файлом)« вы уже потеряли. –

+0

Статически свяжите необходимый код 'ntp' в своем исполняемом файле. Даже с лучшими методами обфускации кто-то, кто достаточно мотивирован, сможет извлечь ключ. – OregonTrail

+0

@OregonTrail: на самом деле, если бы я был взломан, я бы просто отслеживал сетевой трафик, замечал запрос на 'pool.ntp.org' и увлекал его (пользовательские'/etc/hosts', 'LD_PRELOAD' с обманным DNS разрешение каких-либо функций) на мой частный экземпляр ntp, выдавая любое время, которое я предпочитаю. –

ответ

0

Учитывая, что сеть должна быть доступна в любое время для использования программы, переместите всю безопасность на сервер. На стороне клиента вы просто что-то вроде

wget https://www.yourserver.com/getkey?keyid=xxxxxxxxxxxxxxxxxxxxx 

Если параметр keyid это некоторый идентификатор требуемого ключа (может быть, его SHA1 подсоленной с какой-то секрет, но все); тогда ваш сервер предоставит требуемый ключ, только если придет время.

 Смежные вопросы

  • Нет связанных вопросов^_^