安全性 – PHP exec()是否将执行的命令存储在任何地方?

假设我在PHP Web应用程序中有以下代码.

$encrypt ? $password = generatePassword($passwordstrength): $password="";
$estring = "7z a -p$password -mx0 packFoo.aes.7z mydir/foo";
if($encrypt) {
    exec($estring);
}
mailuser($password);//uses standard PHP mail function

密码由使用PHP rand()的函数随机生成.

我没有在/ var / logs中找到密码而在.bash_history中找不到密码.

我需要知道,如果服务器受到威胁,是否可以从服务器恢复$password的值.最终,我可以声称$password的值没有存储在服务器上吗?

解决方法:

作为pointed out by Mat in the comments,除非您专门设置审核,否则这样的命令很可能被故意存储在任何地方并以可直接访问的形式保存. grep -lR … /作为root可能是一种启发性的体验(你可能想先重新计算一切noatime ……).

但是,总有一个“但是”.在这种情况下,我可以看到一个显而易见的可能性(特别是当你没有安全地清除你所显示的代码中的$password或$estring变量时)这些可能会被写入交换空间.这意味着即使不存在主动攻击者,他们也会致力于永久存储至少一段时间.这可以通过完全禁用交换或运行使用随机加密密钥加密的交换来大大减轻,这使得重新启动后交换不可访问(因为在清除系统RAM时需要理解它的解密密钥).

我可以想象7zip表现得非常好,可以快速从命令行中清除密码,然后在不再需要时从内部变量中进​​一步清除密码,但扩展密钥表的内容可能会保留更长的时间.因此,时间增加了他们被换掉的可能性.这些不一定允许恢复密码,但它们可能很好地允许从加密存档中恢复明文.在恰当的时刻发出的一个简单的ps axw将显示从命令行以纯文本登录密码的人,但它没有存储,机会窗口很小.

当您发送电子邮件时,我认为它包含明文形式的密码(或者很容易导入相应明文的内容,例如Base64编码的邮件正文).该电子邮件几乎肯定会被临时写入系统的邮件队列,这意味着密码最终会在磁盘上结束(除非您在RAM磁盘上有邮件队列目录,除了邮件队列应该是这样的事实)在持久存储上运行时会出现一系列问题).特别是如果你正在运行一个智能主机设置,那么很快就会删除队列文件,但是因为它已被写入磁盘,所以可以说“损坏就完成了”.像strings / dev / sd这样的东西?在邮件通过的任何服务器上,除非您采取具体步骤来缓解此威胁,否则可能会将密码恢复给知道要查找内容的任何人.

当然,首先,电子邮件并不是完全安全的.通过SMTP对电子邮件进行合理的机密性保证的唯一方法(即使您在整个邮件服务器链中使用SMTP over SSL或STARTTLS)是S / MIME或OpenPGP等端到端加密.

TL; DR:您的Web应用程序可能不会故意存储包括密码或密码本身在内的命令,但在正常操作过程中可能会依赖其他组件.

上一篇:Python math.tau 常量


下一篇:opensuse – 无法启动mysql服务