Perl Advent Calendar 2011-12-09

setuid perl

by Joe Jiang

SUID 是 Unix 的一个概念,可以让执行的程序拥有脚本的拥有者的权限。

    $ bin/mysqlperl -MEnglish -le 'print join qq(\t), $UID, $EUID'
    500     27

    $ id mysql
    uid=27(mysql) gid=27(mysql) groups=27(mysql)

这里的脚本程序 mysqlperl 其实就是 /usr/bin/perl 的一个拷贝,只不过能让 EUID 成为 mysql 用户而已。

$EUID 就是 Effective User ID 变量的缩写(由 English 模块引入别名),代表脚本执行时的实际权限。

这里的 mysql 用户可能有进一步的系统权限设定,比如能够不用密码登录数据库。

    mysql> GRANT ALL ON rt.* TO mysql@localhost identified by '';

要实现这样的 bin/mysqlperl,只需要三步即可:

    $ cp /usr/bin/perl ~/bin/mysqlperl

    $ sudo chown mysql:mysql ~/bin/mysqlperl

    $ sudo chmod u+s ~/bin/mysqlperl

作为验证,一个可选的步骤就是用 ls 查看这个可执行程序的 SUID 位。

    $ ls -l ~/bin/mysqlperl
    -rwsr-xr-x 1 mysql mysql 8836 Dec  4 15:36 bin/mysqlperl

希望你能小心使用这个技巧,注意藏好你的脚本解释器,最好不要轻易被系统管理员发现 :)

View Source (POD)