missions & ガイドライン

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

OWASPトップ10のようなソフトウェアの脆弱性を理解し、軽減するためのセキュアコーディングガイドラインを探求し、実際のアプリシミュレーションで実践するためのガイド付きトレーニングMissions 。

全てを見るmissions

もっと見る
生産性の向上
SQLインジェクション
あるユーザーから、インターネットバンキング・ソリューションのトランザクション検索機能にSQLインジェクションの脆弱性があるという報告を受けた。彼らは、他のユーザのトランザクションを見ることができたと述べ、この脆弱性によって、攻撃者はデータベースに対して、テーブルの削除、他のテーブルからのデータの閲覧、データの挿入など、あらゆる種類の厄介なことを行うことができると指摘した。このミッションでユーザーが行ったことを再現してみよう。
生産性の向上
Spring MvcRequestMatchers
2023年3月、Springは内部で発見された脆弱性CVE-2023-20860の修正版をリリースした。この脆弱性は、mvcRequestMatchersで二重のワイルドカード**を使用することで、Spring SecurityとSpring MVCの間でパターンの不一致を引き起こす可能性があるというものだ。これは最終的に、ユーザーが特定のエンドポイントに不正アクセスすることにつながります。いくつかのエンドポイントを持つ非常に単純化された銀行アプリケーションをセットアップしました。指示に従って、このアクセス制御の脆弱性の影響を再現してみてください。
生産性の向上
トロイの木馬のソース - 信頼できないソースからのコンポーネントの使用
バイキングバンクの開発者の一人が、クレジットカードを管理するための管理者権限チェックを記述するために、潜在的に脆弱なコンポーネントを含むインターネット上の信頼できないソースからコードをコピーしてしまいました。私たちは、管理者だけがこの権限を持つはずなのに、ユーザーがクレジットカードの限度額を変更していることに気づきました。私たちはこのコードに何か問題があると考えています。コードを調査するミッションを試してください。
生産性の向上
サイキックシグネチャー - 既知の脆弱なコンポーネントの使用
CVE-2022-21449は、Javaにおけるサイキック・シグネチャ(Psychic Signatures in Java)という、脆弱性としては最高にクールな別名を持っている。なぜこの名前がついたのか?ドクター・フーのサイキック・ペーパーにちなんでいる。誰かに見せると、この白紙はその人が期待するもので埋められる。Java(バージョン15から18まで)のECDSAアルゴリズムの実装でも似たようなことが起こり、JWTの署名検証に影響を及ぼしている。私たちは無効な署名を提出することができるが、Javaはそれを有効だと考えてしまう。どのように機能するか見たいですか?さっそく始めましょう。
生産性の向上
Apache Path Traversal - 既知の脆弱なコンポーネントの使用
2021年10月4日、Apacheチームは、CVE-2021-41773としても知られるApache 2.4.48のパストラバーサルとリモートコード実行の脆弱性に対処するため、Apacheのバージョン2.4.49をリリースした。2021年10月7日、2.4.50のHotfixの修正が完了していないため、バージョン2.4.51をリリースした。この脆弱性はCVE-2021-42013として追跡されました。この脆弱性がどのように悪用されるか、このミッションを試してみてください。
生産性の向上
Codestashbin - 安全でないパスワードリセット機能
CodeStashBinは、世界最大級のコード・バージョン・コントロール・ホスティング会社である。噂によると、パスワード忘れ処理に欠陥があり、安全でないパスワードリセット機能の脆弱性があるとのことです。特権ユーザーのパスワードを変更して、そのアカウントにアクセスすることが可能かもしれません。この問題を調査するために、このミッションに飛び込んでください。
生産性の向上
Log4j - 既知の脆弱なコンポーネントを使用する
2021年12月初旬、非常に人気のあるロギング・ライブラリLog4jの0日エクスプロイト(CVE-2021-44228)が発表され、Javaコミュニティに爆弾が落とされた。Log4Shellと名付けられたこのエクスプロイトは、Log4j v2のバージョン2.0-beta9から2.14.1に影響し、リモートでコードが実行される可能性があります。私たちは、このエクスプロイトを模擬する環境をセットアップしました。今すぐ試してください。
生産性の向上
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文にコードを注入してアプリケーションを攻撃し、重要な情報を収集します。ウェブセキュリティの脆弱性の一つです。データベースを操作し、そこから重要な情報を引き出すハッキングの最も一般的な手法です。

ガイドラインを見る

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

ts
let url = request.params.url;

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

return render.export();

サーバサイドリクエストフォージェリの脆弱性は、ユーザがアプリケーションに攻撃者が決めたドメインへの HTTP リクエストを行わせることができる場合に発生します。アプリケーションがプライベート/内部ネットワークにアクセスできる場合、攻撃者はアプリケーションに内部サーバへの リクエストを行わせることもできます。本ガイドラインでは、この脆弱性が実際にどのようなものであるかをよりよく理解するために、いくつかの例 を挙げて詳しく見ていきます。

ガイドラインを見る

セキュリティの設定ミス

多くのフレームワークは、本番環境であろうとテスト/開発環境であろうと、アプリケーションのモニタリングを可能にするエンドポイントのセットも持っています。これらは次のものを含みます:

Metrics (Prometheus)
Logs
Environment information
Path/Url Mappings

セキュリティの誤設定とは、悪いコードではなく、アプリケーションのコンフィギュレーション設定に起因する一般的な脆弱性を網羅する、やや包括的な用語です。これは広範なテーマであり、あなたの技術スタックのような要因に大きく依存します。多くの場合、これらの問題への対処は、設定ファイルやコードの1行を変更するような単純に見えるものですが、これらの脆弱性の影響や結果は深刻なものになる可能性があります。この脆弱性とその緩和方法についての詳細は、ガイドラインをお読みください。

ガイドラインを見る

パスワード保管

特徴 暗号ハッシュ パスワードハッシュ 速度 非常に速い 意図的に遅い ワークファクターを調整できる いいえ はい

アプリケーションがユーザーを認証する場合、パスワードを扱う可能性もあります。ユーザのパスワードを扱うことは本当に大きな問題であり、それを適切に扱うことはさらに大きな問題です。アプリケーションが攻撃され、ユーザーのパスワードがインターネット上に流出し、すべての人に見られることより悪いシナリオを想像するのは難しい。パスワードはどのようにして安全に、ベストプラクティスに従って保管できるのでしょうか?いくつかの方法を見てみましょう。

ガイドラインを見る

セキュリティの設定ミス - XXE 詳細

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

XML eXternal Entities」(XXE)脆弱性クラスは、XMLパーサーに関わるセキュリティの誤設定である。XML 標準には、ファイルや URL などの「エンティティ」を参照する方法が含まれています。パーサが外部エンティティを完全に解決することは、XML 文書が潜在的な攻撃者にファイルやその他の機密情報を開示することにつながることを意味します。詳しくはガイドラインの全文をお読みください。

ガイドラインを見る

質量の割り当て

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>  

Mass Assignment は、API エンドポイントが、関連するオブジェクトのどのプロパティをユーザが変更できるかを制限しない脆弱性です。この脆弱性は、HTTP パラメータのモデルへの自動的なバインディングを可能にするライブラリ/フレームワークを使用する場合に発生する可能性があります。リクエストからオブジェクトへの自動バインディングの使用は、時には非常に便利ですが、ユーザがアクセスすることを意図していないプロパティをモデルが持っている場合、セキュリティの問題につながる可能性もあります。詳しくはガイドラインをお読みください。

ガイドラインを見る

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

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

return file.read(path);

パストラバーサルは、インジェクション脆弱性のもう一つのかなり一般的なタイプです。URIの構築(URLであれ、ファイルパスであれ、その他のものであれ)が、完全に解決されたパスが意図したパスのルート外を指していないことを適切に保証していない場合に起こりがちです。パストラバーサル脆弱性の影響は、トラバーサルが発生するコンテキストと、行われた全体的なハードニングに大きく依存します。詳しくはガイドラインを読んでください。

ガイドラインを見る

インジェクション - XSS

```html
<!--- UNSAFE: The htmlSnippet will get interpreted without any escaping --->
@Html.Raw(htmlSnippet)
```

XSSとしても知られるクロスサイト・スクリプティングは、インジェクション脆弱性のもう1つのタイプで、攻撃者が制御するスクリプトを他のユーザーのブラウザで評価させるものです。XSSは、HTML/JavaScriptインジェクションの脆弱性とも考えられます。遭遇する可能性のあるXSSのタイプを見てみましょう。

ガイドラインを見る

ファイルのアップロード

public string UploadProfilePicture(FormFile uploadedFile)
{
    // Generate path to save the uploaded file at
    var path = $"./uploads/avatars/{request.User.Id}/{uploadedFile.FileName}";

    // Save the file
    var localFile = File.OpenWrite(path);
    localFile.Write(uploadedFile.ReadToEnd());
    localFile.Flush();
    localFile.Close();

    // Update the profile picture 
    UserProfile.UpdateUserProfilePicture(request.User, path)

    return path;
}

アプリケーションは、ある時点で、ユーザがアプリケーション内のどこかにファイルをアップロードできるようにする必 要が生じることがよくあります(使用するため、あるいは単に保存するため)。単純なことのように見えますが、この機能をどのように実装するかは、ファイルアップロードの処理方法に関連する潜在的なリスクのために、かなり重要になる場合があります。詳しくはガイドラインを読んでください。

ガイドラインを見る

インジェクション101



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

最もよく知られている脆弱性のクラスのひとつは、インジェクション脆弱性である:SQLインジェクションだ。技術界でSQLインジェクションを聞かないのは難しい。インジェクションの欠陥を簡単に紹介するので、読んでみてほしい。

ガイドラインを見る

認証と認可

cs

// Ensure the default behaviour is to authenticate requests, and check if they are admin
[Authenticate]
[Authorize("Admin")]
public class SecureController : Controller
{

}

public class MyController : SecureController
{

    // Overrides the Authorize attribute inherited to allow any user to access the page

ガイドラインを見る

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

let ip = request.params.ipAddress;

system("ping " + ip);

コマンド・インジェクション単体を見てみよう。ここでは、コマンド・インジェクションが実際にどのようなものかを理解しやすいように、いくつかの例を取り上げます。簡単に復習しておくと、コマンド・インジェクションの脆弱性は、ユーザ入力がオペレーティング・システムのコマンドの一部を使用する場合に発生します。詳しくはガイドラインを読んでください。

ガイドラインを見る