[Rails]XSSについてとdefaltセキュリティ機能、対処法

2023/04/12に公開

XSS(Cross Site Scripting)とは?!

Webサイトの脆弱性を利用し、記述言語であるHTMLに悪質なスクリプトを埋め込む攻撃。
Cross Site Scriptingの略称として"XSS"といい、
日本語では、クロスサイトスクリプティングという。

攻撃者は、Webアプリケーション上の入力フォームなどにスクリプト付のリンクを仕込むことで、
他のユーザーがそのリンクをクリックした際に、悪意のあるスクリプトを実行させることができる。
 => サイトに設置されたフォームにユーザーが情報を入力・送信する際に、
  埋められた悪質なHTMLスクリプトが実行され、入力された情報に加えCookie情報なども
  攻撃者に送られる。

今回自分が、サイト作成しながら体験した事例

技術投稿サイトを作成していて、
markdown形式formで投稿新規作成時、中身に<script>と文字列で入力していた。
そのまま投稿すると、その<script>以降が表示がされない!
文字数の制限も行っていないのに?!?!
=> xssが問題でした!!!

  • formないで<script>と文字列を入力し投稿したことにより、自分でXSS攻撃を仕掛けたこととなった
  • そこ以降表示されなかったのは、markdown用にgem"Redcarpet"を
    入れていたことによるXSS対策がされていたから。
     ( => 自分で攻撃したが、過去の自分が対策していたから守られた )
    = 表示されないという結果になった。

※gem"Redcarpet"は以下項目で解説

XSSの攻撃流れ

以下の流れで行われます。

1. 攻撃者は、悪意のあるスクリプトを含むリンクや入力フォームをWebアプリケーションに仕込む。
具体的には、掲示板やコメント欄などの入力フォームに悪意のあるスクリプトを入力し、
送信することで仕込むことができる。

2. 攻撃対象のユーザーが、攻撃者が仕込んだリンクや入力フォームを開く。
例えば、攻撃者が仕込んだリンクをクリックするなど、攻撃対象のユーザーが
Webアプリケーションにアクセスすることで、攻撃が発生する可能性がある。

3. 悪意のあるスクリプトが実行され、攻撃が行われる。
攻撃者が仕込んだスクリプトが実行されることで、攻撃対象のユーザーの情報が盗まれたり、
不正な操作が行われたりする可能性がある。

XSS対策

XSSの攻撃を防ぐには、Webアプリケーションの入力値のバリデーションやエスケープ処理が必要
Webアプリケーションにおいて、エスケープ処理が不十分だと、
XSS攻撃などのセキュリティ上の問題が発生する可能性がある。

エスケープ処理とは?
特定の文字列や文字を、別の文字列に変換する処理のこと。
ex.
HTMLには特殊文字がある。< や >、& などは特殊文字として認識される。
これらの特殊文字をそのまま表現すると、HTMLの構造を崩しセキュリティに引っ掛かるため、
エスケープ処理を行って適切に表現する必要がある。
<エスケープ処理の例>
HTMLにおいて...

これらの特殊文字を、エスケープ処理によって適切に変換することで、
HTMLの構造を崩すことなく、安全に表示することができるようになるということ。

XSS対策

サニタイジング (スクリプトの無害化)

ユーザーからの入力データに含まれる不正なコードを無害化することでXSS攻撃を防止する技術。
Railsでは、
デフォルトのセキュリティ機能であるHTMLエスケープ処理によって、
基本的なサニタイジングが行われるが、さらに強力なサニタイジングを実現するために、
外部ライブラリやGemを使用することができる

ex.

  1. Loofah
     - HTMLをパースして、不正なタグや属性を除去することができる。
  2. Sanitize
     - HTMLをサニタイズすることができる。
  3. Rack::Attack
     - リクエストのIPアドレスやヘッダーなどをフィルタリングすることができる。

入力値の制限

ユーザーが入力できる値を制限することで、XSS攻撃を防止する方法

  • 文字種の制限:数字以外の入力を許可しないことで、スクリプトの挿入を防止。
  • 入力値の長さの制限:攻撃が可能となるスクリプトの挿入をある程度抑制することが可能。

WAFの導入

WebアプリケーションにWAF(Web Application Firewall)を導入することで、
XSS攻撃を防止する方法。

  • リクエスト内容の監視:WAFは、ユーザが送信するリクエスト内容を監視して、不正な通信を遮断。
  • サイバー攻撃からの保護:WAFは、Webサイトを含めたWebアプリケーションをサイバー攻撃から守る.

これらのライブラリやGemを使用することで、より高度なサニタイジングが可能になる。
しかし、過度なサニタイジングは、正当な入力データを誤って無害化してしまう可能性があるため、
注意が必要。

Ruby on Railsのdefaltセキュリティ機能

様々なセキュリティ問題があるが、
以下に、代表的なセキュリティ問題とRailsのdefalt対策を記述する。
※defaltだけでは防ぎきれない部分もあるので、上記のような対策を加えます!!!!

1. CSRF対策

CSRF(クロスサイトリクエストフォージェリ)攻撃は、Webアプリケーションの脆弱性の1つ
であり、攻撃者がWebアプリケーションに不正なリクエストを送信することで、攻撃を行う。
Railsでは、フォーム送信時にトークンを生成し、
リクエストと共に送信することで、CSRF攻撃を防ぐ

この機能は、form_withやbutton_toなどのヘルパーメソッドを使うことで簡単に実装可。

2. XSS対策

XSS(クロスサイトスクリプティング)攻撃は、Webアプリケーションの脆弱性の1つであり、
攻撃者がWebページに不正なスクリプトを挿入することで、攻撃を行う
Railsでは、ビューに表示するデータに対して自動的にHTMLエスケープ処理を行うことで、
XSS攻撃を防ぎます。
この機能は、<%= %>や<%== %>などのエスケープを行うヘルパーメソッドを
使うことで簡単に実装できます。

3. SQLインジェクション対策

SQLインジェクション攻撃は、Webアプリケーションの脆弱性の1つであり、
攻撃者がSQL文に不正なクエリを注入することで、攻撃を行う
Railsでは、ActiveRecordを利用することで、SQLインジェクション攻撃を防ぐ
ActiveRecordは、自動的にパラメータのエスケープ処理を行い、安全なSQL文を生成します。

4. パラメータフィルタリング

パラメータフィルタリングは、リクエストに含まれるパラメータを、制限したり変更したりすることができる。
これにより、不正なデータが送信された場合に、そのデータをフィルタリングして無効化することが可。

5. 強力な認証・権限管理

Railsでは、強力な認証・権限管理機能を提供している。
DeviseやCanCanCanなどのgemを使用することで、簡単に実装することができる。


補足:gem "Redcarpet"

Redcarpetは、Rubyで作成されたMarkdownパーサーライブラリで、
Markdown形式のテキストをHTMLに変換するための機能
がある。
以下にそれ以外の部分での、Redcarpetの主な機能をいくつか紹介します。

  • XSS対策
    Redcarpetは、デフォルトでXSS対策が施されている。
    HTMLタグや属性、URIスキームなどに関する制限を設けることで、XSS攻撃を防止。

  • オートリンク
    Redcarpetは、自動的にURLやメールアドレスなどをリンクに変換する機能がある。
    これにより、Markdownテキストに含まれるURLなどがクリック可能なリンクになります。

  • 強調表示やリストなどの機能
    Redcarpetには、強調表示やリストなどのMarkdownの機能をHTMLに変換する機能がある。
    これにより、Markdownで記述されたテキストをHTMLに変換することができます。

  • 拡張機能
    Redcarpetは、Markdownの拡張機能をサポートしている。
    たとえば、GitHub Flavored Markdown(GFM)の機能や、テーブル、ストライクスルー、
    自動リンクなどをサポート。

以上のように、Redcarpetには、XSS対策やオートリンクなどの便利な機能が含まれている。
また、Markdownの様々な機能をサポートしているため、Markdown形式のテキストをHTMLに変換する際に、Redcarpetを使用することで、効率的かつ安全な変換が可能

Discussion