xmlrpc ddos

最近幾天這個 blog 的 CPU 時常都是 100% usage,由 php-fpm 佔用了整個 CPU 資源,有時甚至幾個 php-fpm 一起用盡 CPU,情況非常奇怪。
每次 reboot 或將 php-fpm 重新 restart 都可以令 CPU 回復正常,但可能需要每日也重啓 1-2 次,不能接受。
雖然對 server 速度沒有大影響,但時常這樣亦令企企不安。

最初以為 WP_cron job 出問題,因為WordPress Social Sharing Optimization 這個 plugin 背景自動執行,嘗試 disable 它看看會否好一點。
不過今早看一看 log,就發現 xmlprc.php 被不尋常讀取,以每秒 1-2 個 request 做成 php-fpm 時常運行,亦因為執行太多次而令 php 速度變慢,大量 process 需要寫入去 slow log,做成雙重負載。

xmlrpc.php 其實是一個處理 pingback 的檔案。
pingback 功能原意是,如果有人引用並提供連結到站長的文章,就會有 pingback,站長那篇文章會有連結到引用文章。
這個功能互相連結理論上是互相幫忙,對大家都好。
不過這功能已經被人用來 spam,連結其他 Google PR 更高的網站,來提高自己的排名,是黑帽 SEO 方法之一。
而且亦有機會像今次一樣被用來做攻擊的跳板。
所以有些人會不想要這些功能,但 WordPress 3.5 後卻不能 disable xmlrpc,不能直接關閉以避過攻擊。

解決方法

其實因為今次攻擊來自單一 IP,亦是讀取單一檔案,所以解決方法亦不難,只要在 .htaccess 加上這幾句就可以了。

<Files xmlrpc.php>
Order allow,deny
Deny from THAT_IP
</Files>

如果是由多個 IP 攻擊可以用 Deny from all,完全禁止使用 xmlrpc。

最後就要處理攻擊源頭,這個 IP 是由美國 Wholesale Internet 發出,所以亦 send 了 email 去對方的 Hosting 看看可否由對方幫忙解決。
暫時在 web server 的 access log 還可以看到對方有 connection 來,但 php 的 log 就已經看到 server 不再處理有關 request.

P.S. 阿 Q 啲諗,被 DDOS 是否一種「人氣的認証」呢?
不過其實我發覺大陸百度 search 7.1 遊行的相片時都會找到本 blog,是否有關呢?