オペレーティングシステム

1. URL
2. 担当教員
3. 講義目的
4. 到達目標
5. 授業方法
6. 参考書
7. 成績評価
8. スケジュール
9. 大崎が担当する科目に共通の連絡事項・アドバイス
10. 1. オペレーティングシステムの概要
11. 2. CPU の原理
12. 3. プロセスとスレッド
13. 4. プロセス間通信
14. 5. スケジューリング (1)
15. 6. スケジューリング (2)
16. 7. 前半の総復習
17. 8. メモリ管理 (1)
18. 9. メモリ管理(2)
19. 10. 入出力 (外部 I/O)
20. 11. 入出力 (ユーザインターフェース)
21. 12. ファイルシステム
22. 12. 後半の総復習
23. 授業中試験について

12. ファイルシステム

授業の流れ・チーム分けの方針・態度目標

2025-04-25 のものと同じ。

https://lsnl.jp/~ohsaki/lecture/os/2025/#12-1

内容目標

- オペレーティングシステムにおけるファイルの構造を理解し、さまざまな種類のファイルを判別する仕組みを理解する。

- 階層型ディレクトリシステムの構造を理解し、ツリー構造に対するアルゴリズムによってファイルシステムを走査する方法を理解する。

- 階層型ディレクトリシステムのパス名を理解するとともに、セキュリティホールが生まれる原因の一つを理解する。

- ファイルシステムにおけるディレクトリエントリの役割を理解し、通常、ファイルを削除してもファイルの実体は削除されないという仕組みを理解する。

課題

課題 1

以下のファイル foo がどのような種別のファイルかを調査せよ。 ただし、既存のファイル種別判別ツールの使用は禁ずる。

https://lsnl.jp/~ohsaki/lecture/os/2025/priv/foo

課題 2

階層型ディレクトリシステムのディレクトリ構造は木 (tree) で表現できる。 ファイルシステムに格納されているすべてのファイルの一覧を表示するアルゴリズムを説明せよ。

課題 3

以下は、 GET リクエストのクエリ文字列に指定された Python のヘルプファイルを表示する CGI プログラム badprog である。

#!/usr/bin/env python3
import os
print('Content-type: text/html\n\n')
# クエリ文字列は環境変数 QUERY_STRING に格納されている
file = os.getenv('QUERY_STRING')
# 指定されたファイルをオープンし、ファイルの内容を返す
with open(f'/var/www/html/python-help/{file}') as f:
    print(f.read())

/var/www/html/python-help ディレクトリ以下に、 Python のさまざまモジュールのヘルプファイル (例: python-help/sys.html) が置かれている。 例えば、

https://server/cgi-bin/badprog?sys.html

によって sys モジュールのヘルプファイルが表示される (上記は架空の URL である)。

このプログラムの脆弱性を利用し、 サーバ上のパスワードファイル /etc/passwd を盗み出す方法を説明せよ。

課題 4

ある人が USB メモリに誤って数万人の個人情報が入ったファイルをコピーしてしまった。 あわてて該当ファイルを削除し、 オペレーティングシステムのごみ箱を空にした。 この人の対応は正しいか。 正しくないなら、 何がどのように正しくないかを説明せよ。

略解

課題 1

現在の多くのオペレーティングシステムでは、 ファイルは単なるバイト列である。 ほとんどのファイルは、 ファイル先頭のマジックナンバーによって判別できる。

ファイルの先頭 16 バイトを 16 進ダンプするプログラムの例 (dymp.py)。

$ cat dump.py
#!/usr/bin/env python3
import sys
file = sys.argv[1]
with open(file, 'rb') as f:
    buf = f.read(16)
    for b in buf:
        print(f'{b:02x} ', end='')
print()

$ python3 dump.py foo
67 69 6d 70 20 78 63 66 20 76 30 31 31 00 00 00 

以下より、 GIMP の画像フォーマットである XCF ファイルであることがわかる。

List of file signatures
https://en.wikipedia.org/wiki/List_of_file_signatures

課題 2

木の走査 (tree traversal) アルゴリズムを使えばよい。 ルートディレクトリから、 深さ優先探索で木を走査し、 訪問した頂点 (ファイル) の一覧を出力すればよい。

課題 3

クエリ文字列をそのままオープンするファイルのパス名に使用しているところに脆弱性がある。 この CGI プログラムによって、 HTTP サーバ上のあらゆるファイルを取得できてしまう。

パス名に .. が利用できることを利用すれば、/etc/passwd ファイルは /var/www/html/python-help/../../../../etc/passwd によってアクセスできる。 したがって、

https://server/cgi-bin/badprog?../../../../etc/passwd

にアクセスすることで /etc/passwd ファイルを入手できる。

課題 4

正しくない。 ファイルシステムにおけるファイル削除は、 通常、 ディレクトリエントリを削除するだけであり、 ファイルの実体は削除されない。 したがって、削除したはずの個人情報のファイルを容易に復元することができる。

※巨大な (例えば 1 G バイトの) ファイルを書き込む時間と、 書き込んだファイルを削除する時間を計測してみよ。 ファイルの書き込みよりも、 ファイルの削除のほうが圧倒的に高速である。 これも、ファイル削除はディレクトリエントリを書換えているに過ぎないからである。

レポート課題 2022-06-27

「レポート課題 2025-04-11」と同じ。

https://lsnl.jp/~ohsaki/lecture/os/2025/#10-10

質問

- 今回の階層ディレクトリの問題にあった、https://server/cgi-bin/badprog?../../../../etc/passwdの .. と Cygwinで使う cd .. の .. は同じ意味ですか?

はい。. や .. の扱いは POSIX (UNIX の標準規格) で規定されていて、Cygwin は
POSIX API を Windows 上でエミュレートしています。

Cygwin
https://cygwin.com/

Cygwin is:
- a large collection of GNU and Open Source tools which provide functionality similar to a Linux distribution on Windows.
- a DLL (cygwin1.dll) which provides substantial POSIX API functionality.

- 今までのレポートで獲得できている点数を知りたいのですが、公開されたり、教えてもらうことは可能でしょうか?

公開していません。

コメント

- 今回のテーマは「ファイル」や「ディレクトリ」など、普段から日常的に使っている概念を対象としていたため、自分の生活と密接に結びついた学習になった。特に、マジックナンバーの確認や、ファイル削除後の復元検証といった実践的な活動を通して、OSの機能がどれほど多層的に設計されているかを体感することができた。また、脆弱性を「見る」だけでなく「再現してみる」ことにより、攻撃の成立条件や防止策の現実的な難しさについてもリアルに理解することができた。自習の過程では、手を動かして確認することで知識が定着する感覚を何度も実感し、単なる講義の受け身的な学びでは得られない深い理解につながった。今後もこのように「自分で仮説を立て、検証し、理解する」というサイクルを意識して、自律的に学んでいきたいと強く思った。

- 楽しい授業だったので、もうすぐで終わってしまうのが悲しいです。

  そうですね。秋学期の「ネットワークコンピューティング」、「ネットワークコン
  ピューティング実習」も同じようなスタイルの授業ですのでぜひ受講してください。


[<20. 11. 入出力 (ユーザインターフェース)] [>22. 12. 後半の総復習]