Axios JavaScriptパッケージでサービス拒否(DoS)の脆弱性を発見 — 人気HTTPクライアントの全バージョンに影響
2019年5月6日
0 分で読めますaxiosは、ブラウザーやNode.jsサーバープロジェクトで広く使われている、PromiseベースのモダンなJavaScript HTTPクライアントです。npmから毎週300万回以上ダウンロードされています。
Snykは、axiosに影響する中程度の深刻度(CVSS 5.3)のサービス拒否脆弱性を記録しました。この脆弱性は、2017年にはすでに開発者のJeremy ApthorpによってプロジェクトのGitHubのIssueで議論・共有されていました。
axiosの影響を受けるバージョンには、maxContentLengthを超過した後もリクエストのコンテンツ処理が続き、I/OとCPUの使用量が増加することで、サービス拒否(DoS)が発生する脆弱性があります。
脆弱性について
Anthorpは、受信するHTTPレスポンスのサイズを制限するaxios APIの使用例として、GitHubのIssueにコードスニペットを投稿しました。
しかし、コンテンツ長の上限に関係なく、HTTP接続はファイル全体のデータ転送が完了するまで開いたままになります。そのため、リモートドメインを管理する者や、セキュリティが確保されていない通信経路を盗聴する者が大容量のファイルを送り、リクエストの完了を長時間妨げる可能性があります。
この記事の執筆時点では、この脆弱性に対する公式の修正は公開されていません。ただし、問題を修正するプルリクエストがコミュニティからプロジェクトのGitHubリポジトリに提出されており、マージとリリースを待っている状態です。
Snykユーザーには、axiosのバージョン>= 0.17.0向けのセキュリティパッチを適用することで保護が提供されます。このパッチにより、サービス拒否の脆弱性を緩和できます。
リポジトリを接続してパッチを適用する。
更新(2019年5月31日):修正がリリースされ、axiosのバージョン>= 0.19.0で利用可能になりました。
Snykは、スキャンした21万5,000件以上のプロジェクトでこの脆弱性を特定し、該当するユーザーに直ちに通知しました。ランタイムセキュリティモニタリングソリューションをご利用のユーザーには、脆弱性の存在だけでなく、対処の緊急性もお知らせしました。ほとんどの場合、アプリケーションのランタイムコードフローで到達可能であり、悪用される可能性が高いためです。
axiosの場合、アプリケーションとのランタイムセキュリティモニタリングの連携により、本番環境で稼働中のデプロイにおけるセキュリティ問題を特定する能力が向上しました。
自分にも影響がありますか?どうすればよいですか?
信頼できないソース、または安全でない経路を通じてリソースをリクエストしている場合、悪意あるユーザーがリモートリソースを操作できるため、サービス拒否の脆弱性の影響を受ける可能性があります。
Node.jsサーバーでaxiosを使っている場合、ランタイムがシングルスレッドであるため、深刻な影響が生じる可能性があります。I/OやCPUなどのリソース使用量が急増すると、そのサーバーに接続しているすべてのユーザーに悪影響が及びます。ブラウザー環境では、アプリケーションでaxiosによるリソース取得をどのように利用しているかによって深刻度は異なりますが、エンドユーザーにサービス拒否の影響が及びます。
どうすればよいですか?
Snykをご利用の場合は、前述のセキュリティパッチを適用して自動的に保護できます。
この脆弱性を防ぐため、axiosへの各呼び出しに次の緩和策を適用し、防御的なコードを記述してください:
axios({ url: ..., maxContentLength: 2000, }).catch((error) => { error.request.res.destroy(); });これはhttps://github.com/axios/axios/issues/1098#issuecomment-334874694で提案されている方法です。提案されているプルリクエストの修正をhttps://github.com/axios/axios/pull/1485から手動で適用してください。
オープンソースプロジェクトの健全性について
プロジェクトの人気が高まるにつれ、オープンソースのメンテナンスはますます困難になります。Issueの数が増えて対応に多くの時間が必要になり、ドキュメントの作成や最新状態の維持にかかる作業も増えていきます。さらに、バグ修正や安定版のリリースなど、プロジェクトのメンテナーに求められる作業は多岐にわたりますが、その多くは完全にボランティアで行われています。
プロジェクトへの影響をできるだけ抑えるため、オープンソースの依存関係は十分に調査したうえで選定しましょう。Snykの分析からわかるaxiosプロジェクトの依存関係の健全性に関する情報を、いくつかご紹介します。
axiosの最初のバージョン0.1.0が公開されたのは、5年前の2014年8月29日です。
最新の安定版バージョン0.18.0は、9か月前の2018年2月19日に公開されました。
リリースされたすべてのバージョンが、前述のサービス拒否脆弱性の影響を受けます。
プロジェクトには159人もの開発者が貢献していますが、リリースはプロジェクトリーダーのNick UraltsevとMatt Zabriskieが引き続き管理しています。
CTFを始めよう
オンデマンドのバーチャル入門ワークショップを視聴して、CTFの課題の解き方を学びましょう。
