信頼できるアプリケーションの実行
-
08-10-2019 - |
質問
2つのアプリケーションがあると仮定します。
MasterApp
Slaveapp
MasterAppは、いくつかの引数でSlaveAppを実行しています、Fe: slaveapp --param1 100 param2 "hello"
それを直接見ることはできませんが、誰かがSlaveAppに提供された引数を検査し、コンソールからそれを実行しようとするかもしれません。
ユーザーがコンソールモード(またはスレーブまたは別のアプリとして)で実行できないように、SlaveAppがMasterAppによってのみ実行可能になるようにしたいと思います。私はいくつかを提供することを考えていました unique_string
と md5(unique_string + salt)
, 、しかし、誰かが議論を検査する場合、彼は何が起こっているのかを理解するかもしれません。 2回使用できないユニークで信頼できる議論を提供することによってのみ、それを行う方法はありますか(プライベート/パブリックキーなどのファイルのようなリソース共有はありません)。
解決
通信チャネルがマスター - >スレーブのみになった場合、リプレイ攻撃を避けることは基本的に不可能です。リクエストにタイムスタンプを入れて署名することは役立つかもしれませんが、それでも完璧ではありません(特に攻撃者が時計をある程度制御している場合)。
より良い戦略は、マスターとスレーブの間の双方向コミュニケーションを確立することです。あなたが働いている言語はわかりませんが、通常、マスターがコマンドライン以外に分岐した後に奴隷と話す方法があります。
そのチャネルを使用して、スレーブにランダムなノンセを生成し、マスターに送信し、マスターに署名し、奴隷に送り返し、奴隷の署名を確認できます。
他のヒント
事前に定義された暗号化キーで渡されたパラメーターを暗号化するだけで、何らかのタイプのcheck_stringを含めてください(つまり、エポック時間)。次に、SalveAppのパラメーターをデコードし、CHECK_STRING(この例ではエポック時間である)が特定の範囲内であるか、特定の値であることを確認します。
以下は単純なルビーの例です。単一のファイルにあるため、Command Line引数ECTをHandelに変更する必要があります。
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
スレーブアプリがマスターアプリが実行しているのと同じユーザーが所有していることを確認し、World Readableまたは実行可能ではないことを確認してください。