Выполнение доверенного приложения - PullRequest
0 голосов
/ 12 декабря 2010

Предположим, что у нас есть два приложения:

MasterApp

SlaveApp

MasterApp выполняет SlaveApp с некоторыми аргументами, например: slaveapp --param1 100 param2 "hello"

ВыЯ не могу видеть это напрямую, но кто-то может попытаться проверить аргументы, предоставленные slaveapp, и выполнить его из консоли.

Я хочу, чтобы slaveapp стал исполняемым только для masterapp, чтобы пользователь не мог запустить его в консолирежим (или как раб или другое приложение).Я думал о предоставлении некоторых unique_string и md5(unique_string + salt), но если кто-то проверит аргументы, он может понять, что происходит.Есть ли какой-то способ сделать это только путем предоставления уникального, доверенного аргумента, который нельзя использовать дважды (и нет разделения ресурсов, такого как файлы с закрытыми / открытыми ключами и т. Д.)?

Ответы [ 3 ]

1 голос
/ 12 декабря 2010

Как насчет простого шифрования передаваемых параметров с помощью заранее определенного ключа шифрования и включения строки check_string некоторого типа (то есть время EPOCH). Затем декодируйте параметры в salveapp и убедитесь, что строка check_string (в этом примере это время EPOCH) находится в определенном диапазоне или имеет определенное значение.

Вот простой пример ruby, он находится в одном файле, поэтому вам нужно изменить его на аргументы командной строки handel ect.

require 'openssl'
require 'digest/sha1'
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
c.encrypt
# your pass is what is used to encrypt/decrypt
c.key = key = Digest::SHA1.hexdigest("1094whfiubf9qwer8y32908u3209fn2032")
c.iv = iv = c.random_iv
e = c.update("#{Time.now.to_i}")
e << c.final
puts "encrypted: #{e}\n"


#sleep(15) #if you uncomment this the validation will fail.
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
c.decrypt
c.key = key
c.iv = iv
d = c.update(e)
d << c.final
if(Time.now.to_i - d.to_i < 10)
    puts "decrypted: #{d}\n"
    puts "Validated EPOCH Time"
else
    puts "Validation FAILED."
end
0 голосов
/ 13 декабря 2010

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

0 голосов
/ 12 декабря 2010

В принципе невозможно избежать повторных атак, если ваш канал связи только ведущий -> ведомый. Подписание запроса с отметкой времени может помочь, но даже это не идеально (особенно если атакующий имеет некоторый контроль над часами).

Лучшая стратегия - установить двустороннюю связь между ведущим и подчиненным. Я не уверен, на каком языке вы работаете, но обычно мастер может разговаривать с подчиненным после его разветвления, кроме как из командной строки.

Используя этот канал, вы можете заставить подчиненное устройство генерировать случайный одноразовый номер, отправить его ведущему, подписать его ведущим, отправить его обратно подчиненному и проверить подпись в подчиненном устройстве.

...