Вопрос

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

MasterApp

Slaveapp.

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top