【问题标题】:Trusted application execution可信的应用程序执行
【发布时间】:2010-12-11 23:25:35
【问题描述】:
假设我们有两个应用程序:
主应用
SlaveApp
MasterApp 正在执行带有一些参数的 SlaveApp,fe: slaveapp --param1 100 param2 "hello"
你不能直接看到,但有人可能会尝试检查提供给 slaveapp 的参数,并从控制台执行它。
我希望 slaveapp 只能由 masterapp 执行,这样用户就不能在控制台模式下运行它(或作为从属应用程序或其他应用程序)。我正在考虑提供一些unique_string 和md5(unique_string + salt),但如果有人会检查论点,他可能会理解发生了什么。有没有办法只通过提供一些不能重复使用的独特的、受信任的参数来做到这一点(并且没有资源共享,比如带有私钥/公钥的文件等)?
【问题讨论】:
标签:
algorithm
hash
console-application
trust
【解决方案1】:
如何仅使用预定义的加密密钥加密传递的参数并包含某种类型的 check_string(即 EPOCH 时间)。然后对salveapp中的参数进行解码,验证check_string(本例中为EPOCH时间)是否在一定范围内或者是某个值。
这是一个简单的 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
【解决方案2】:
如果你的通信通道只是主 -> 从,基本上是不可能避免重放攻击的。使用时间戳对请求进行签名可能会有所帮助,但即使这样也并不完美(尤其是如果攻击者可以控制时钟)。
更好的策略是在主从之间建立双向通信。我不确定您使用的是哪种语言,但通常主服务器在分叉后可以与从服务器对话,而不仅仅是命令行。
使用该通道,您可以让从机生成一个随机 nonce,将其发送给主机,让主机对其进行签名,将其发送回从机,并检查从机中的签名。
【解决方案3】:
确保从属应用由运行主应用的同一用户拥有,并确保它不是全球可读或可执行的。