公開ミッションとガイドライン

実践的なセキュアコーディング

OWASP Top 10のようなソフトウェアの脆弱性を理解し軽減するためのセキュアコーディングガイドラインを確認しましょう。また、実践的なアプリシミュレーションを通じて学べるトレーニングミッションにもぜひ挑戦してください。

デモを予約する

すべてのミッションを見る

拡張性とエンゲージメント

SQLインジェクション

インターネットバンキングソリューションの取引検索機能において、SQLインジェクションの脆弱性を悪用できるとの報告がユーザーから寄せられました。報告によると、他ユーザーの取引履歴が閲覧可能であり、この脆弱性を突くことでデータベースのテーブル削除や他テーブルのデータ閲覧、データの挿入といった悪意ある操作が可能になる恐れがあるとのことです。このミッションでは、報告された内容を実際に再現してみてください。

今すぐ試す
拡張性とエンゲージメント

Spring MvcRequestMatchers

2023年3月、Springは内部で発見された脆弱性「CVE-2023-20860」に対する修正をリリースしました。これは、mvcRequestMatchersで二重ワイルドカード「**」を使用すると、Spring SecurityとSpring MVCの間でパターン不一致が発生し、最終的にユーザーが特定のエンドポイントへ不正アクセスできてしまう可能性があるというものです。ここでは、いくつかのエンドポイントを持つ非常にシンプルな銀行アプリケーションを用意しました。手順に従って、このアクセス制御の脆弱性の影響を再現してみてください。

今すぐ試す
拡張性とエンゲージメント

サイキック・シグネチャー - 既知の脆弱性のあるコンポーネントの使用

CVE-2022-21449は、脆弱性の別名としては最高にクールな「Javaのサイキック・シグネチャー」と呼ばれています。なぜこのような名前がついたのでしょうか。これは『ドクター・フー』に登場する「サイキック・ペーパー」に由来します。この真っ白な紙は、相手に見せると相手が期待する内容がそこに浮かび上がるというものです。Java(バージョン15から18)のECDSAアルゴリズムの実装でも同様の現象が起こり、JWTの署名検証に影響を及ぼしました。無効な署名を送信しても、Javaがそれを有効だと誤認してしまうのです。仕組みが気になりますか?それでは見ていきましょう。

今すぐ試す
拡張性とエンゲージメント

Apacheのパス・トラバーサル - 既知の脆弱性のあるコンポーネントの使用

2021年10月4日、ApacheチームはApache 2.4.48におけるパス・トラバーサルおよびリモートコード実行の脆弱性(CVE-2021-41773)に対処するため、バージョン2.4.49をリリースしました。その後、2.4.50の修正が不完全であったため、2021年10月7日にバージョン2.4.51がリリースされました。この脆弱性はCVE-2021-42013として追跡されています。このミッションを通じて、この脆弱性がどのように悪用されるのかを実際に体験してみましょう。

今すぐ試す
拡張性とエンゲージメント

Log4j - 既知の脆弱性コンポーネントの使用

2021年12月初旬、非常に広く利用されているログライブラリ「Log4j」にゼロデイ脆弱性(CVE-2021-44228)が発見され、Javaコミュニティに大きな衝撃が走りました。「Log4Shell」と名付けられたこの脆弱性は、Log4j v2のバージョン2.0-beta9から2.14.1に影響を及ぼし、リモートコード実行につながる恐れがあります。この脆弱性を再現する環境を用意しましたので、その影響を直接体験してみてください。今すぐ試す。

今すぐ試す
拡張性とエンゲージメント

トロイの木馬ソース - 信頼できないソースからのコンポーネントの使用

Viking Bankの開発者が、クレジットカード管理用の管理者権限チェック機能を実装する際、インターネット上の信頼できないソースからコードを安易にコピーしてしまいました。そのコードには脆弱なコンポーネントが含まれている可能性があります。本来は管理者のみが変更できるはずのクレジットカードの利用限度額を、一般ユーザーが変更できてしまう事象が確認されました。このコードに問題があると考えられます。ミッションに挑戦して、コードを調査してください。

今すぐ試す
拡張性とエンゲージメント

CodeStashBin - 安全でないパスワードリセット機能

CodeStashBinは、世界最大級のコードバージョン管理ホスティング企業です。パスワードの再設定プロセスに欠陥があり、安全でないパスワードリセット機能の脆弱性が存在するという噂があります。特権ユーザーのパスワードを変更し、アカウントに不正アクセスできる可能性があります。このミッションに参加して、問題を調査しましょう。

今すぐ試す
拡張性とエンゲージメント

「ChatterGPT」におけるクロスサイトスクリプティング(XSS)

このミッションでは、広く利用されているLLMの馴染み深いインターフェースを再現し、2023年11月下旬に生成された実際のコードスニペットを使用します。ユーザーはこのスニペットを読み解き、本来の目的で使用された場合に潜むセキュリティ上のリスクを調査します。

今すぐ試す

すべてのガイドラインを見る

絞り込み:
フィルターを非表示
選択
フィルターを表示
選択
フィルターを解除
タグ
スーパーアイコン [★]
トピック
もっと見る

ログと監視の不備

ベストプラクティス:

機密性の高い機能に対する監査ログの記録
エラーログの記録
ログの一元管理
ログの一定期間の保持
ログのPII(個人識別情報)を定期的に監査する

ログ記録と監視は、問題が発生した後に初めて検討されることがよくありますが、これらが適切に行われていない場合、非常に大きな代償を払うことになりかねません。極端な例として、セキュリティ関連か否かを問わずインシデントが発生した際、ログがほとんど、あるいは全く残っていないと、実際に何が起きたのかを解明することが不可能になります。一方で、過剰なデータを記録することはプライバシー問題につながり、規制当局とのトラブルを招く恐れもあります。不十分なログ記録と監視を回避するためのベストプラクティスガイドラインをぜひご確認ください。

ガイドラインを見る

既知の脆弱性を持つコンポーネントの使用

{
 "dependencies": {
   "foo": "1.0.0 - 2.9999.9999",
   "bar": ">=1.0.2 <2.1.2"
 }
}

多くのアプリケーションは、大量のサードパーティ製コンポーネントを利用しています。これらのコンポーネントは、ログ記録、テンプレート作成、データベースアクセスなど、あらゆる機能を提供します。これによりソフトウェア開発は大幅に効率化され、多くの時間を節約できます。しかし、これらも人間によって作られている以上、必然的に脆弱性が含まれる可能性があります。詳細についてはガイドをご覧ください。

ガイドラインを見る

SQLインジェクション

import mysql.connector
db = mysql.connector.connect
#悪い例。避けてください!これは学習用です。
(host="localhost", user="newuser", passwd="pass", db="sample")
cur = db.cursor()
name = raw_input('Enter Name: ')
cur.execute("SELECT * FROM sample_data WHERE Name = '%s';" % name) for row in cur.fetchall(): print(row)
db.close()

SQLインジェクション(SQLi)とは、SQL文に不正なコードを注入することで、アプリケーションから重要な情報を攻撃・窃取するWebセキュリティ上の脆弱性です。データベースを操作して機密情報を抜き出す手法として、最も一般的に用いられるハッキング技術です。

ガイドラインを見る

セキュリティの設定不備

多くのフレームワークには、本番環境やテスト・開発環境を問わず、アプリケーションの監視を可能にするエンドポイントが用意されています。これには以下のようなものが含まれます。

メトリクス(Prometheus)
ログ
環境情報
パス/URLマッピング

セキュリティ設定の不備(Security Misconfiguration)とは、コードの欠陥ではなく、アプリケーションの設定に起因して発生する一般的な脆弱性を指す包括的な用語です。これは非常に広範なテーマであり、使用する技術スタックなどの要因に大きく依存します。多くの場合、設定ファイルの変更やわずか1行のコード修正といった単純な作業で解決できるように思えますが、こうした脆弱性がもたらす影響や結果は甚大になる可能性があります。この脆弱性の詳細と対策については、当社のガイドラインをご覧ください。

ガイドラインを見る

サーバーサイドリクエストフォージェリ

ts
let url = request.params.url;

let response = http.get(url);
let render = response.render();

return render.export();

サーバーサイドリクエストフォージェリ(SSRF)の脆弱性は、攻撃者が指定したドメインに対して、アプリケーションにHTTPリクエストを送信させることが可能になることで発生します。アプリケーションがプライベートネットワークや内部ネットワークにアクセスできる場合、攻撃者はアプリケーションを介して内部サーバーへリクエストを送信させることも可能です。本ガイドラインでは、具体的な例を交えながら、この脆弱性が実際にどのようなものか詳しく見ていきます。

ガイドラインを見る

パスワードの保存

Feature Cryptographic hash Password hash Speed Very fast Intentionally slow Work factor can be adjusted No Yes

アプリケーションでユーザー認証を行う場合、パスワードを扱う機会は必ず訪れます。ユーザーのパスワードを扱うことは非常に重要であり、それを適切に管理することはさらに重要です。アプリケーションが攻撃を受け、ユーザーのパスワードがインターネット上に流出して誰の目にも触れるような事態は、想像するだけでも恐ろしいものです。では、パスワードを安全かつベストプラクティスに沿って保存するにはどうすればよいのでしょうか。いくつかの方法を見ていきましょう。

ガイドラインを見る

マスアサインメント

html
<form method="POST">
     <input name="Id" type="hidden" value="666">
     <input name="Name" type="text" value="Bad guy">
     <input name="EmailAddress" type="text" value="hacker@attacker.com">
     <input name="IsAdmin" type="hidden" value="true">
     <input type="submit">
</form>  

マスアサインメントとは、APIエンドポイントが関連オブジェクトのどのプロパティをユーザーが変更できるかを制限していない場合に発生する脆弱性です。この脆弱性は、HTTPパラメータをモデルに自動バインドするライブラリやフレームワークを使用し、その後の検証を行わない場合に発生する可能性があります。リクエストからオブジェクトへの自動バインドは非常に便利な機能ですが、モデル内にユーザーがアクセスすべきではないプロパティが含まれている場合、セキュリティ上の問題につながる恐れがあります。詳細については、ガイドラインをご覧ください。

ガイドラインを見る

セキュリティ設定の不備 - XXEの詳細

xml
<?xml version="1.0" ?>
<!DOCTYPE outerElement [
   <!ENTITY externalEntity SYSTEM  "file:///etc/passwd" > ]>
<outerElement>&externalEntity;</outerElement>

「XML外部エンティティ(XXE)」脆弱性は、XMLパーサーに関連するセキュリティ設定の不備の一種です。XML標準には、ファイルやURLなどの「エンティティ」を参照する仕組みが含まれています。パーサーのデフォルト設定では、外部エンティティを完全に解決するようになっていることが多く、その結果、XMLドキュメントを通じてファイルやその他の機密情報が攻撃者に漏洩する恐れがあります。詳細については、ガイドラインの全文をご覧ください。

ガイドラインを見る

インジェクション - パストラバーサル

疑似コード
let baseFolder = "/var/www/api/documents/";
let path = baseFolder + request.params.filename;

return file.read(path);

パストラバーサルは、非常によく見られるインジェクション脆弱性の一種です。これは、URI(URL、ファイルパスなど)を構築する際に、解決されたパスが意図したルートディレクトリの外側を指していないことを適切に検証できていない場合に発生しやすくなります。パストラバーサル脆弱性の影響は、その脆弱性がどこで発生するか、またシステム全体でどのような堅牢化対策が講じられているかに大きく依存します。詳細についてはガイドラインをご覧ください。

ガイドラインを見る

認証と認可

cs

// デフォルトの動作としてリクエストを認証し、管理者権限があるかを確認する
[Authenticate]
[Authorize("Admin")]
public class SecureController : Controller
{

}

public class MyController : SecureController
{

    // 継承されたAuthorize属性を上書きし、すべてのユーザーがページにアクセスできるようにする

ガイドラインを見る

インジェクション - XSS

```html
<!--- 安全ではありません: htmlSnippetはエスケープされずに解釈されます ---&gt;
@Html.Raw(htmlSnippet)
```

クロスサイトスクリプティング(XSS)は、攻撃者が制御するスクリプトが他のユーザーのブラウザで実行されてしまう、インジェクション脆弱性の一種です。XSSはHTML/JavaScriptインジェクション脆弱性と見なされることもあります。ここでは、遭遇する可能性のあるXSSの種類について見ていきましょう。

ガイドラインを見る

注射の基礎知識

代表的なインジェクション攻撃には以下のようなものがあります:

SQLインジェクション
クロスサイトスクリプティング(HTML/JavaScriptインジェクション)
パストラバーサル(パス/URLインジェクション)
コマンドインジェクション
コードインジェクション

数ある脆弱性の中でも特によく知られているのがインジェクション攻撃であり、その代表格といえば、誰もが納得するSQLインジェクションでしょう。IT業界においてSQLインジェクションという言葉を耳にする機会は非常に多いため、今回はこのテーマを取り上げます。インジェクション攻撃の概要については、以下をご覧ください。

ガイドラインを見る

ファイルアップロード

public string UploadProfilePicture(FormFile uploadedFile)
{
    // アップロードされたファイルの保存先パスを生成
    var path = $"./uploads/avatars/{request.User.Id}/{uploadedFile.FileName}";

    // ファイルを保存
    var localFile = File.OpenWrite(path);
    localFile.Write(uploadedFile.ReadToEnd());
    localFile.Flush();
    localFile.Close();

    // プロフィール写真を更新
    UserProfile.UpdateUserProfilePicture(request.User, path)

    return path;
}

アプリケーションにおいて、ユーザーがファイルをアップロードする機能(利用目的や保存目的を問わず)が必要になることは非常に一般的です。一見単純な機能に思えますが、その実装方法によっては、ファイル処理に伴う潜在的なリスクが重大な問題に発展する可能性があります。詳細については、ガイドラインをご覧ください。

ガイドラインを見る

コマンドインジェクション

let ip = request.params.ipAddress;

system("ping " + ip);

コマンドインジェクションについて詳しく見ていきましょう。ここでは、実際の動作を理解しやすくするために、いくつかの異なる例に焦点を当てます。まず復習として、コマンドインジェクションの脆弱性は、ユーザー入力がオペレーティングシステムのコマンドの一部として使用される場合に発生します。詳細については、ガイドラインをご覧ください。

ガイドラインを見る