S-PLUS for UNIXのセキュリティ問題について
マルチユーザでS-PLUSを利用しているUNIXシステム上に、もしログイン可能な悪意のあるユーザがいる場合、/tmpへのシンボリックリンクによりファイルを改変される可能性があります。
ただし、この設定で改変される可能性があるのは、ユーザが書き込み権を持つファイル(通常自分自身のファイル)のみです。また、悪意のあるユーザが該当システムへの login 権限を持っている場合に限ります。
symbolic link attack に関して
S-PLUSは /tmp に一時ファイルを作成することがあります。もし悪意のあるユーザが、壊したい対象のファイルを /tmp で同名でシンボリックリンクを張っておくと、S-PLUS起動時にこのファイルが置き換えられることがあります。
詳細は http://online.securityfocus.com/archive/1/305342 をご覧ください。
対応方法
もしあなたのUNIXシステムに悪意のあるユーザが存在する可能性がある場合は、システム管理者は以下の対応をとってください。なお、この問題は将来リリースのS-PLUSで修正される予定です。
- rootでS-PLUSを動作させないでください。(この操作はどんな場合でも推奨しません)
- 起動スクリプト Splus (通常は/usr/local/binの下などにあります) の1行目と2行目の間に、以下を挿入してください。これにより、S-PLUS起動時に symbolic link attack が仕掛けられているかどうかチェックします。
(ls -ld /tmp/__F[0-9]* 2>/dev/null;echo "") | grep '^l'
if [ $? != 1 ] ; then
echo "$0: Possible security problem:"
echo "$0: a symbolic link with a name of the form '/tmp/__F[0-9]*' exists"
echo "$0: Please remove it and try again"
exit 1
fi
- 関数 tempfile() を修正します。以下のコードを、S-PLUSをインストールしたディレクトリの下の local/S.init に追加してください。これにより、S-PLUS起動時に古いtempfile()が修正済みのtempfile()に置き換わります。
.tempfile <- get("tempfile", "splus")
tempfile <- function(pattern = "file") {
if(exists(".Stempdir", 0))
ptn <- get(".Stempdir", 0)
else {
## initialize, but check that the .tempfile version
## uses /tmp file names. Basically a check for platform
ptn <- .tempfile()
if(identical(substring(ptn, 1, 5), "/tmp/")) {
ptn <- paste("/tmp/S_tmp", unix("echo $$"), sep="")
## make the directory, lock out others
status <- unix(paste("mkdir -m 700", ptn), output = FALSE)
if(status != 0) {
warning("Command to create directory \"", ptn,
"\" failed; reverting to standard, insecure tempfile")
ptn <- character()
}
else ptn <- paste(ptn, "/", sep="")
assign(".Stempdir", ptn, where = 0)
}
}
if(length(ptn) > 0)
paste(ptn, pattern, unix("echo $$"), sep = "")
else
.tempfile(pattern)
}
- PRINT, mustfix.hlinks, sgml2html ファイルを、実行できないように無効にします。これらのファイルはインストール時もしくはSGMLファイルの印刷時にのみ利用されるので、通常は使いません。
# cd `Splus6 SHOME`/cmd
# chmod a-x PRINT mustfix.hlinks sghl2html
(2003/1/27 更新)