AmazonLink の Powerd by 表示からのリンク先は現在記事カテゴリーになっていますが、これの変更先として固定ページを作りました。
- AmazonLink(雑念ベース)
ダウンロード案内ページは WordPress Plugins/JSeries、実際のダウンロードは SourceForge.jp、新しい情報の通知はこのサイトとばらばらになってしまっているので、ポータル的な案内ページの形に持って行きたいと思っています。
AmazonLink の Powerd by 表示からのリンク先は現在記事カテゴリーになっていますが、これの変更先として固定ページを作りました。
ダウンロード案内ページは WordPress Plugins/JSeries、実際のダウンロードは SourceForge.jp、新しい情報の通知はこのサイトとばらばらになってしまっているので、ポータル的な案内ページの形に持って行きたいと思っています。
WordPress の自動アップグレードをしようとすると「このブログのプラグインを更新するための十分な権限がありません。」となってしまうので調査をしていたのですが、原因が判明しましたので記事にします。
まず、調査対象のバージョンは2.8.4です。2.6系から直接アップグレードしたもので、一番初めは2.0ME系でした。接頭辞は wp
です。
権限がないといわれてしまう原因ですが、そのまま権限が与えられていないためです。管理者で作業しているので普通はそんなことはありえないのですが、どうやらアップグレード時に行われるデータベースの更新に問題があったようです。
権限の情報はオプションとしてデータベース上に記録されていて、次のSQLで見つけることができます。
このオプションの値はPHPでシリアライズしたもので、管理者や編集者といったロール(役割)ごとに権限を配列の形で格納しています。wp-includes/capabilities.php
の冒頭には、次のように書かれています。
権限の記録は20行目の配列で、権限名がキーでその権限があるかどうかを示す真偽値が値となります。
さて、ここまでを踏まえて実際にどのように権限情報が記録されているかを確認します。PHPで表示させるプログラムを書いてみてもいいのですが、面倒なのでもっと手っ取り早い方法を使いました。
前述したSQLでオプション値を取得し、それをテキストエディタ(私は秀丸エディタを使いました)に貼り付けます。このままではすべてが1行に繋がってわかりにくいので、{ と } と ; の後ろにテキスト置換で改行を入れました。
こうすると、権限名と真偽値が交互になってわかりやすくなります。
準備ができたら権限名を探します。自動アップグレードのアドレスから、きっかけとなるコードは wp-admin/update-core.php
であることがわかりますので確認します。
冒頭の12行目に次のようにあります。
update_plugins
という名前の権限を確認して、権限がなければメッセージを表示して終了するという処理ですね。早速この権限名を先ほど準備したテキストデータで探しますと、見当たりません。この名前をキーとする配列要素がないということになりますので、PHPでは真偽値は false となります。
念のため新規に同じバージョンのインストールをしてみた場合で確認したところ、しっかりとこの権限については true となっていました。
こうなると原因が気になります。アップグレードスクリプトの権限処理をするところを探してみました。アップグレードインストールをするときのファイル名を基点にしてたどってみたところ、wp-admin/includes/upgrade.php に定義されている upgrade_all()
という関数の中で、WordPressデータベースのバージョンによってアップグレード用の関数を呼び出していることがわかりました。
呼び出されている upgrade_***()
という関数の中では、さらに必要に応じて populate_roles_***()
という関数を呼び出しています。
この関数の定義は wp-admin/includes/schema.php
にあり、そこではまさにロールごとに権限の追加を行っていました。
次のSQLでデータベースバージョンを確認して呼び出されるはずの関数の処理を確認してみました。
2.6の新規インストール環境では8201となっていましたので、upgrade_all()
の342~346行目が該当します。呼び出される関数の定義は次のとおり。
populate_roles_***()
で追加している権限を確認したところ、3つとも登録されていました。今度はさかのぼって確認してみると、populate_roles_260()
で追加される2つの権限のみがありませんでした。しかもその1つは今回問題となっている update_plugins です。
どうやらここで失敗していたようです。
原因まで判明したので、権限情報の修復を行います。直接書き換えてもいいのですが、間違えると面倒なので簡単なプログラムを作りました。
データを抽出して権限を追加し、再度シリアライズして表示するだけ。表示されたテキストデータをデータベース用の管理画面(ここのサーバーは phpMyAdmin が使えるのでそれを使いました)から直接反映させました。
このプログラムは自由に使っていただいてかまいませんが、何かあったときの補償はできませんので自己責任でお願いします。
というわけで、無事自動アップグレードの画面を拝むことができました。
すでに昨夜の話になってしまいますが、AmazonLink 2.0.0 beta2 をリリースしました。ダウンロードは、いつものようにWordPress Plugins/JSeriesのサイトからどうぞ。
ページ投稿画面での検索フォーム追加や、AmazonLink コードの変更などをしています。また、アップグレードが進むとの予測から、急いで WordPress 2.8.4 での動作検証も行いました。2.8系は投稿画面の幅が狭くなっているため、ボタンなどのレイアウトも少し変えてあります。
AmazonLinkコードの変更ですが、商品ごとにテンプレートを変える機能を思いついたためです。テンプレートは複数行になる可能性が高いため、属性値とするには不向きです。そのため、コードに挟むことができるようにしました。
なお、内部で変換処理を行っているので、今までの形式も使用することはできます。
ASIN は Amazon Standard Item Number の略で、Amazon の商品コードです。
現在は個別のテンプレートには対応できていませんが、TODOには入れておこうと思います。手を出しすぎると切りがないので、正式リリースまでは触らない予定です。
現在、WordPress 2.8.4 未満に存在するセキュリティーホールをターゲットとした不正アクセスが行われているようです。該当バージョンを使用している方はできるだけ早めにアップグレードを行ってください。当サイトも、先ほど作業を行いました。
不正アクセスが行われているかどうかの判別については、コリスさんがまとめてくださっています。
また、この記事に書かれている「WordPress Permalink & Rss problems」を、山本さくらさんが和訳した物を公開されています。
WordPress | 日本語 には、本家ブログの記事「How to Keep WordPress Secure」を訳したものが掲載されました。
これらの記事を参考に、不正アクセスが行われていないかどうかの確認と最新版へのアップグレードを行ってください。アップグレード済みであっても、念のため不正アクセスの有無の確認は行ってほうがいいと思います。
コリスさんの記事にもありますが、不正アクセスの形跡があった場合はデータベースも不正アクセスされている可能性があるとのこと。その場合はこのセキュリティホールが発見されるよりも十分古いバックアップに戻す以外は対策はなさそうです。
そうならないためにも、できるだけ早くアップグレードを行ってください。
それでもアップグレードを渋っている方には、Naoさんによる次の記事をどうぞ。
山本さくらさんが、攻撃内容について詳しく書かれています。
古いバージョンを使用しているところはすべてアウトと言うわけではないようですね。
とは言うものの、まだ見つかっていないセキュリティーホールによって条件がゆるくなる可能性は十分あります。残念ながら「バグのないプログラムはない」のです。
8月14日に公開となった AmazonLink 2.0.0 beta では、テンプレート機能によってある程度自由にデザインを作ることができるようになっています。
管理画面上の説明でどこまで伝わるのか自信がないので、現在このサイトで使用しているテンプレートを公開しようと思います。
テーブルの幅が固定であったりしますが、別のサイトにも流用可能かと思います。WordPress や プラグイン同様に GPL ライセンスとしますので、ご自由にお使いください。
JSeries サイトの更新はまだですが、先ほど AmazonLink 2.0.0 beta をリリースしました。
現在 SourceForge.JP の以下のアドレスからダウンロードができるようになっています。
http://sourceforge.jp/projects/wppluginsj/downloads/43119/AmazonLink-2.0.0beta.zip/
Jseries サイトを更新しました。メジャーバージョンアップと言うことで、新規にページを作成してあります。
http://wppluginsj.sourceforge.jp/amazonlink2/
平日は忙しくてまったく時間はないわ、休日は平日できてないことをやってると終わってしまうわでほぼ停止状態でしたが、昨日と今日で AmazonLink を Amazon の Product Advertising API に対応させました。
ついでに WordPress 2.7 にも対応させたので、近いうちにベータ版として公開することができそうです。2.8 は未テストなので、対象外の予定です。
また、サイドバーでやってたアンケートの結果を元に、今回から動作環境条件として PHP 5.1 以上とします。これにより、Amazon とのやり取りの処理が PHP のネイティブ関数を使えるようになるので処理が早くできるはずです。PHP 4.x の環境しかない方はごめんなさい。
ベータ版として公開したあとの予定ですが、プログラムの整理と PHP 5.x らしい書き方への変更をしたいと思っています。一緒に WordPress 2.8 にも対応したいですね。
今後も使っていただけるという方は、Product Advertising API アカウントの取得をしておいてください。8月15日以降は、アカウントがないと投稿画面での検索ができなくなります。
アイコンをクリックするだけで感想を投稿できる ClickComments というサービスを利用していましたら、いつの間にか終了してしまっていました。
専用の WordPress プラグインで記事の下に表示していたのですが、いつの間にか表示されない状態に。一時的な問題かと思って様子を見ていましたが、いつまでも直らないので調べてみたら表示のためにサービスサイトから読み込む JavaScript ファイルが Not found。
サービスサイトを見に行ってみると、長期のサービスをサービスを続ける余裕がないために無期限に終了するというメッセージが表示されていました。
Unfortunately, postreach ClickComments has been shut down indefinitely because we can no longer afford to keep it running.
クリックして下さる方もいらしたので残念ですが、プラグインを停止しました。
同じようなサービスをご存知でしたら、ぜひコメントをください。
Amazon.co.jp からいろいろな情報を取得することができる”Amazon アソシエイト Web サービス”というサービスがありますが、”Product Advertising API”という名称に変わるとのことです。そして、情報のリクエストには署名による認証が必要になるとのこと。
拙作 WordPress プラグインの AmazonLink でもこのサービスを使用しているので他人事ではありません。
基本方式はほとんど変わらないとのことですが、認証で使用する電子署名の作成には、開発者登録をしたときに作成した Secret Access Key というものが必要になるようです。リクエスト時のデータによって変わるため、電子署名データだけをプログラムに埋め込んでおくことができません。また、Secret Access と言うくらいなのでこれを公開するのも駄目でしょう。
詳しい情報がまだ得られていないのでなんとも言えませんが、ただ使うだけの人にも開発者登録をしてもらわないと駄目になるかもしれません。
今のところは、たつをさんによる記事が一番詳しそう。
電子署名データの作成には RFC 2104-compliant HMAC with the SHA256 hash algorithm という変換処理のようなものが必要で、これを行うための関数である hash は PHP5 でないと標準では使用できません。PHP4 はすでに終了宣言が出ているのですが、まだ PHP5 が使用できないサーバーもあるので悩みどころです。
不正アクセスを受けていたようです。現時点で判明している被害と行った対策は次のものです。
先日、投稿した記憶のない記事がRSSに含まれていることに気がつきました。実際に過去の日付で投稿されており、不正アクセスをされたと結論付けました。
記事の内容は、違法またはセキュリティ的に危険な内容のサイトへの誘導と思われます。幸いタグが間違っているためにリンクにはなっておりませんでしたが、すぐに記事は削除いたしました。
どのような形で投稿が行われたのかは不明ですが、WordPress を2.6系の最新バージョンへアップグレードいたしました。また、XML-RPC などの外部から投稿を可能にする機能は無効にしてあります。
テンプレートファイルの footer.php に大量の隠しリンク(スタイルシートで非表示にしてありました)を記入されていました。本来4KBほどのサイズなのですが、記入されたファイルは1MB弱になっていました。
書き込まれた内容は、やはり外部サイトへのリンクでした。隠しリンクになっていましたので、検索エンジンロボットを対象としたものでしょう。
リンクの中には WordPress を使用したサイトと思われるものも多数ありましたので、WordPress を使用しているサイトが狙われている可能性があります。ユーザーの方は、書き換えが行われていないか確認することをお勧めします。
追記された部分については、すでに削除してあり、そのほかのテンプレートに関しても確認を行いました。
また、管理画面から編集可能にするためファイル属性を666(誰でも書きこめる状態)にしてあったため、危険であると判断して644(ファイルの所有者のみが書きこめる状態)に変更しました。
HTML convert time: 0.263 sec. Powered by