【问题标题】:Secure way to update UNIX account password using Python as root user?使用 Python 作为 root 用户更新 UNIX 帐户密码的安全方法?
【发布时间】:2020-12-24 05:12:41
【问题描述】:

考虑一个 UNIX 帐户 jdoe。我想使用以root 运行的python 脚本更新jdoe 的密码。目前,我正在使用:

cmd = 'echo "' + username + ":" + new_pass + '" | chpasswd '
os.system(cmd)

但是,这是一种不安全的方法。如果有人将new_pass 输入为pass"; rm -rf / #,那将是灾难性的。

有安全可靠的方法吗?

【问题讨论】:

    标签: python linux unix passwords


    【解决方案1】:

    如果您担心不受信任的输入,最好避免使用os.system,因为这会调用 shell,而且通常您不希望 shell 靠近不受信任的输入。此外,您通常希望避免将秘密放入命令行参数中,因为它们可以被其他用户读取,尽管由于echo通常是内置的,严格来说这不是一个问题在这里。

    要安全地执行此操作,您可以改用subprocess.Popen,如下所示:

    import subprocess
    
    proc = subprocess.Popen(['chpasswd'], stdin=subprocess.PIPE)
    proc.stdin.write(b"username:password")
    

    请注意,如果您需要将其他参数传递给 chpasswd,您可以通过向数组添加参数来实现:

    proc = subprocess.Popen(['chpasswd', '-c', 'SHA512'], stdin=subprocess.PIPE)
    

    【讨论】:

    • 这似乎与new_pass = pass"; rm -rf / # 合作。我希望我没有忽略什么。
    • 它确实应该使用任意密码,包括包含 shell 注入的密码。在这种情况下,这只是密码的一部分,而不是安全漏洞。
    • 令人惊讶的是,这不适用于烧瓶,我不知道为什么。
    • 啊,用proc.communicate(input=...) 替换proc.stdin.write(...) 解决了这个问题。
    【解决方案2】:

    我会对其进行修改,以便输入的密码被散列(sha512 是现代 Linux 系统上的标准),然后将散列值传递给您的 cmd。

    cmd = 'echo "' + username + ":" + new_pass + '" | chpasswd -e'
    os.system(cmd)
    

    注意chpasswd之后的-e

    进一步充实上述建议:

    import crypt
    entered_password = 'pass"; rm -rf / #'
    new_password = crypt.crypt(entered_password, '$6$' + 'salt1234')
    

    【讨论】:

    • 我在做cmd = 'echo "' + username + ":" + sha512(new_pass) + '" | chpasswd -e'os.system(cmd),但是当我尝试登录时,new_pass 无效。 chpasswd -e 的默认哈希值是多少?它似乎不是 sha256。
    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2012-04-21
    • 2019-11-24
    • 1970-01-01
    相关资源
    最近更新 更多