[SA18579] OpenSSH scp Command Line Shell Command InjectionによるとOpenSSH 3.x,4.x(2006/02/01にリリースされた4.3にてlocal-to-local, remote-to-remoteの問題は修正されました)のscpでは、system()関数を用いているためにリモートホストでもシェルによるコマンドの解釈が行われます。このため適当に細工を施されたファイル名をコピーすると、リモートホストでユーザの権限でコマンドが実行されます。(この記述は間違っていました) local-to-localやremote-to-remoteのコピーの際にsystem()関数を用いているのでシェルによるファイル名の解釈が2度おこなわれます。このためにコピーが意図しない結果となることがあります。これを利用して、細工を施したファイルをコピーするとコピーしたユーザの権限でコマンドを実行することができます。修正されるまでは怪しいファイル名のファイルをscpでコピーしないようにしましょう。
bugzilla.redhat.com に投稿されたパッチをみたところ、scp.cでlocal-to-localやremote-to-remoteでのコピーの際に使用されていたsystem()がfork()+execvp()で置き換えられています。他にscp.cでsystem()を利用している箇所はありません。
(2006/01/29 14:30ごろ追記)remote-to-localやlocal-to-remoteでもscpからコマンドを実行できることを確認しました。「% scp remote:\;/bin/sleep\ 1000 .
」や「% scp foo remote:.\;/bin/sleep\ 1000
」などとすることでremoteでコマンドを実行することができます。local-to-localやremote-to-remoteとは異なり実際のファイルのコピーによってコマンドが実行されるわけではありません。しかし、攻撃者がソーシャルエンジニアリングと組み合わせてリモートホストでコマンドを実行させるのに利用される恐れはあるでしょう(この記述は間違っていました)。
(2006/1/30 9:20ごろ追記)local-to-localなどのように実際のファイルのファイル名を利用してコマンドを実行させることが可能です。
% ls
remote:;yes
% scp * foo
で(remoteでyesにパスが通っていれば)remoteでyesが実行されます。
(2006/01/29 17:30ごろ追記)rsyncでも「rsync foo remote:.\;sleep\ 1000」や「rsync remote:foo\;sleep\ 1000 .」でremoteでコマンドが実行できてしまいます。SSHのコマンドを実行する枠組を利用してファイル転送をしている以上、利用者が気をつけるしかないかもしれません。また、SFTPは別の枠組を利用しているのでこの問題はないと思います。
(2006/02/04 01:30ごろ)シェルのメタキャラクタのファイル名への展開の問題とscpの問題を取り違えた記述があったので、消しました。
参考: