一覧SP-05-3 · SWG・DNSフィルタリング

ダウンロードファイルの検査と隔離

名前解決、プロキシ、復号、配送のどこで処理したかを記録から説明します。

説明

ファイル検査は、配送前に保留する方式と、配送後に評価して回収する方式で影響が異なります。隔離という表示だけでなく、どこに何のバイトが残るかを確認します。

ZIPの中身とハッシュを開き、配送前保留、配送後削除、遠隔実行の固定記録を時系列で比較します。通知画面や描画結果と元ファイルも分けて扱います。

名前解決、プロキシ、復号、配送のどこで処理したかを記録から説明します。

1配布物をバイト列として確認する

固定ZIPにHTMLとテキストが入っています。

from sp05 import * from sp02 import show db = connect() raw=archive() print(raw[:4].hex(),len(raw)) print(hashlib.sha256配布物をバイト列として確認する(raw).hexdigest())

先頭はZIPのローカルヘッダーです。ファイル名や拡張子だけでなく内容とハッシュを確認します。

2コンテナ内の個別ファイルを開く

ZIP全体と、内部の検査対象を対応付けます。

z=zipfile.ZipFile(io.BytesIO(raw)) print([(i.filename,i.file_size) for i in z.infolist()]) print(z.readコンテナ内の個別ファイルを開く('page.html').decode())

HTMLにはscript要素があります。コンテナを開かない検査では、内部のこの内容まで評価できません。

3配送前に保留したメールの履歴を読む

f1はゲートウェイで検査してから配送する方式です。

show配送前に保留したメールの履歴を読む(db,"SELECT t,event,place,bytes FROM transfer WHERE id='f1' ORDER BY t")

元ファイル120バイトはゲートウェイで保留され、端末には32バイトの通知が届きます。数値は比較用の固定配送資料です。

4配送後に削除したメールの履歴と比較する

f2は先に端末へ届いた方式です。

show配送後に削除したメールの履歴と比較する(db,"SELECT t,event,place,bytes FROM transfer WHERE id='f2' ORDER BY t")

1秒時点で端末にファイルが届き、3秒で削除されています。その間の閲覧や別コピーまで取り消したとは、この履歴だけでは言えません。

5端末へ元ファイルが届いた行を抽出する

場所とイベントを組み合わせて検索します。

show端末へ元ファイルが届いた行を抽出する(db,"SELECT id,t,bytes FROM transfer WHERE place='endpoint' AND event='download'")

該当するのはf2です。noticeやpixelsの転送を元ファイルのdownloadとして数えると、配送の評価を誤ります。

6遠隔実行と端末への転送を確認する

rbi1は遠隔側で実行した固定記録です。

show遠隔実行と端末への転送を確認する(db,"SELECT t,event,place,bytes FROM transfer WHERE id='rbi1' ORDER BY t")

実行はremote、端末への転送はpixelsです。実際の遠隔ブラウザー製品では描画転送方式やファイル持出し機能も確認する必要があります。

7再配送用のファイルが元の内容と一致するか確認する

ZIPをもう一度生成して内容の一致を検査します。

print(hashlib.sha256再配送用のファイルが元の内容と一致するか確認する(archive()).digest()==hashlib.sha256(raw).digest()) print(hashlib.sha256(z.read('page.html')).hexdigest()) z.close()

ZIP全体と内部HTMLのハッシュは別です。解除や再検査の対象が、元ファイル、内部ファイル、変換後ファイルのどれかを明確にします。

まとめ

配送前の保留と配送後の回収では影響が異なります。

元ファイル、通知、描画結果を分けて追います。

隔離・解除は対象ファイルの同一性も確認します。

操作履歴と解説を振り返れます。

Python 3.15 / TLS MemoryBIO / 固定の経路・配送記録

1
from sp05 import * from sp02 import show db = connect() raw=archive() print(raw[:4].hex(),len(raw)) print(hashlib.sha256(raw).hexdigest())
504b0304 269
52e5c2c52bd5a1c9973a960b38b7c43d49499c190d64fca609ca2bd42d5369ea
2
z=zipfile.ZipFile(io.BytesIO(raw)) print([(i.filename,i.file_size) for i in z.infolist()]) print(z.read('page.html').decode())
[('page.html', 47), ('note.txt', 14)]
<h1>Report</h1><script>public_marker()</script>
3
show(db,"SELECT t,event,place,bytes FROM transfer WHERE id='f1' ORDER BY t")
t | event | place | bytes
1 | download | gateway | 120
2 | quarantine | gateway | 120
3 | notice | endpoint | 32
4
show(db,"SELECT t,event,place,bytes FROM transfer WHERE id='f2' ORDER BY t")
t | event | place | bytes
1 | download | endpoint | 120
2 | verdict | gateway | 0
3 | delete | endpoint | 120
5
show(db,"SELECT id,t,bytes FROM transfer WHERE place='endpoint' AND event='download'")
id | t | bytes
f2 | 1 | 120
6
show(db,"SELECT t,event,place,bytes FROM transfer WHERE id='rbi1' ORDER BY t")
t | event | place | bytes
1 | execute | remote | 120
2 | pixels | endpoint | 80
7
print(hashlib.sha256(archive()).digest()==hashlib.sha256(raw).digest()) print(hashlib.sha256(z.read('page.html')).hexdigest()) z.close()
True
f2ec248e931a2d318c01855f13bc0fcbe81aaf6b45b0b69665ea1184ded73132

演習完了