| 
 | 1 | +<!DOCTYPE html>  | 
 | 2 | +<html lang="ja">  | 
 | 3 | +<head>  | 
 | 4 | +<meta http-equiv="X-UA-Compatible" content="IE=edge">  | 
 | 5 | +<meta charset="utf-8">  | 
 | 6 | +<meta name="viewport" content="width=device-width, initial-scale=1">  | 
 | 7 | +<link rel="stylesheet" href="https://best.openssf.org/assets/css/style.css">  | 
 | 8 | +<link rel="stylesheet" href="checker.css">  | 
 | 9 | +<script src="checker.js"></script>  | 
 | 10 | +<script src="free.js"></script>  | 
 | 11 | +<link rel="license" href="https://creativecommons.org/licenses/by/4.0/">  | 
 | 12 | + | 
 | 13 | +<!-- See create_labs.md for how to create your own lab! -->  | 
 | 14 | + | 
 | 15 | +</head>  | 
 | 16 | +<body>  | 
 | 17 | +<!-- For GitHub Pages formatting: -->  | 
 | 18 | +<div class="container-lg px-3 my-5 markdown-body">  | 
 | 19 | +<h1>ラボ演習 free</h1>  | 
 | 20 | +<p>  | 
 | 21 | +これはセキュアなソフトウェア開発に関するラボ演習です。  | 
 | 22 | +ラボの詳細については、<a href="ja_introduction.html" target="_blank">概要</a>をご覧ください。  | 
 | 23 | + | 
 | 24 | +<p>  | 
 | 25 | +<h2>タスク</h2>  | 
 | 26 | +<p>  | 
 | 27 | +<b>以下のコードを変更して、シンプルな解放後使用(use-after-free)バグを修正してください。</b>  | 
 | 28 | + | 
 | 29 | +<p>  | 
 | 30 | +<h2>背景</h2>  | 
 | 31 | +<p>  | 
 | 32 | +実際、全てのプログラミング言語は開発者が迅速にメモリを確保し、そのメモリ領域にデータを保管することを許しています。  | 
 | 33 | +プログラムがそのメモリを使い終わったら、ほとんどのプログラミング言語は自動的にメモリを回収します。  | 
 | 34 | + | 
 | 35 | +<p>  | 
 | 36 | +しかしながら、C と C++ では <i>手動による</i> メモリ管理が求められます。  | 
 | 37 | +これはつまり、C と C++ を使用する開発者は、<i>手動で</i> システムにメモリ領域の解放を(それぞれ <tt>free</tt> と <tt>delete</tt> を使って)要求しなければならない、ということです。  | 
 | 38 | +手動でのメモリ管理はパフォーマンスに優位性があり、また概念的にはシンプルです。  | 
 | 39 | +しかし手動でのメモリ管理はまた、多様なよくあるタイプのバグをもたらします。  | 
 | 40 | + | 
 | 41 | + | 
 | 42 | +<ol>  | 
 | 43 | +<li>二重解放: 同じメモリ領域を2回以上解放してしまうこと  | 
 | 44 | +<li>解放後使用(use-after-free): 解放後に(読み込みまたは書き込みとして)メモリを使用してしまうこと  | 
 | 45 | +<li>解放し忘れ: 使わなくなったメモリを解放し忘れてしまうこと  | 
 | 46 | +</ol>  | 
 | 47 | + | 
 | 48 | +<p>  | 
 | 49 | + | 
 | 50 | +これらのバグは頻繁に発生します。なぜなら、これはいつものことですが、ソフトウェアが大きく、また複雑になるにつれて、完璧に実装することが難しくなるからです。  | 
 | 51 | +多くの脆弱性は、手動でのメモリ管理のバグに起因しています。  | 
 | 52 | +そのようなバグの <i>全てが脆弱性ではありません</i> が、多くは脆弱性になります。  | 
 | 53 | + | 
 | 54 | +<p>  | 
 | 55 | +<h2>タスクの詳細</h2>  | 
 | 56 | +<p>  | 
 | 57 | + | 
 | 58 | +<p>  | 
 | 59 | +以下の C コードを変更して、シンプルな解放後使用(user-after-free)バグを修正してください。  | 
 | 60 | +このコードで実装されている関数 <tt>tweak</tt> は <tt>s</tt> という文字列を受け取ります。  | 
 | 61 | +この関数は <tt>pre_</tt>、入力されたテキスト(<tt>s</tt>)、<tt>_post</tt> という新しい文字列を生成するために <tt>asprintf</tt> という関数を呼び出します。  | 
 | 62 | +関数 <tt>tweak</tt> は最終的にこの新しい結果を返す必要があります。  | 
 | 63 | +残念なことに現在のコードは、メモリ領域を最後に使用するより <i>前に</i> その領域を解放するための <tt>free</tt> を呼び出しています。  | 
 | 64 | +これにより「解放後使用(use-after-free)」バグが引き起こされます。  | 
 | 65 | +このバグが問題となるかどうかは実装の多くの詳細によりますが、いずれにせよ私たちは問題を引き起こしたくはありません。  | 
 | 66 | + | 
 | 67 | +<p>  | 
 | 68 | +コードを修正しましょう!  | 
 | 69 | +必要に応じて、「ヒント」ボタンと「諦める」ボタンを使用してください。  | 
 | 70 | + | 
 | 71 | +<p>  | 
 | 72 | +<h2>演習 (<span id="grade"></span>)</h2>  | 
 | 73 | +<p>  | 
 | 74 | +<form id="lab">  | 
 | 75 | +<pre><code  | 
 | 76 | +>#include <stdlib.h>  | 
 | 77 | +#include <string.h>  | 
 | 78 | +#include <stdio.h>  | 
 | 79 | + | 
 | 80 | +// 調整バージョンの文字列 s を返す。s は解放する。  | 
 | 81 | +char *tweak(char *s) {  | 
 | 82 | +  char *result; // 結果はここに格納する  | 
 | 83 | +<textarea id="attempt0" rows="4" cols="60" spellcheck="false">  | 
 | 84 | +  free(s);  | 
 | 85 | +  asprintf(&result, "pre_%s_post", s);  | 
 | 86 | +  return result;  | 
 | 87 | +</textarea>  | 
 | 88 | +}  | 
 | 89 | +</code></pre>  | 
 | 90 | +<button type="button" class="hintButton">ヒント</button>  | 
 | 91 | +<button type="button" class="resetButton">リセット</button>  | 
 | 92 | +<button type="button" class="giveUpButton">諦める</button>  | 
 | 93 | +<br><br>  | 
 | 94 | +<p>  | 
 | 95 | +<i>このラボは、<a href="https://www.linuxfoundation.org/">Linux Foundation</a>のDavid A. Wheelerによって開発されました。</i>  | 
 | 96 | +<br><br>  | 
 | 97 | +<p id="correctStamp" class="small">  | 
 | 98 | +<textarea id="debugData" class="displayNone" rows="20" cols="65" readonly>  | 
 | 99 | +</textarea>  | 
 | 100 | +</form>  | 
 | 101 | +</div><!-- End GitHub pages formatting -->  | 
 | 102 | +</body>  | 
 | 103 | +</html>  | 
0 commit comments