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

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. 後半の総復習

12. ファイルシステム

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

2024-06-14 のものと同じ。

https://lsnl.jp/~ohsaki/lecture/os/2024/#18-1

内容目標

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

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

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

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

課題

課題 1

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

https://lsnl.jp/~ohsaki/lecture/os/2024/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-07-05

「レポート課題 2024-04-12」と同じ。

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

質問

- 今回の講義で、ごみ箱にファイルを入れても、ディレクトリエントリだけが削除されるため完全には消去されないと学びましたが、動画ファイルなどの容量が大きなファイルをゴミ箱に入れようとすると容量が大きすぎるため、ごみ箱に入れることができませんと表示されます。ディレクトリエントリのみを削除するだけならこのようなことにはならないのではないかと思いましたが、なぜでこうなるのでしょうか。

Windows で「ごみ箱に入れる」は、実際には削除するのではなく「削除予定のリスト
に追加する」に相当します。「削除予定のリストに入れられる容量」の大きさが決まっ
ているので、上記のような挙動になります。

要望

- 先週の授業について事前にオンデマンドとお知らせされていたため、外せない予定を入れてしまっていました。そのため一週間前に授業形態をオンデマンドから体面に変更されましたが、受けることができませんでした。ご配慮していただけると嬉しいです。

以下のように対応してください。

病欠/公欠時の手続き・学習法
https://lsnl.jp/~ohsaki/lecture/#5

- 今回(12回)課題の課題1のような、Wikipediaからマジックナンバーを探す問題は出るでしょうか?また、ある程度マジックナンバーは覚えていた方が良いのでしょうか?

まだ問題は作成していませんが、重要でない知識の記憶を問う問題は出しません。

コメント

- 講義ありがとうございました。

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