軽量版セキュリティレビュー(2026-08-26、Critical 0 / Major 0 / Minor 2 / Info 6)で挙がった 2 件。いずれも非ブロッキングと判定済みだが、zipWriter を他の経路へ広げる前に塞いでおきたい。
MIN-1: 一時 zip の createWriteStream が symlink を追従する
electron/utils/zipWriter.ts:196 が ${outDir}.zip を既定 flags 'w' で開く。Linux の共有 /tmp(AppImage)では staging 中(分単位)に別のローカルユーザーが symlink を先置きすると、任意ファイルを上書きできる余地がある。
macOS / Windows は per-user temp のため対象外。旧 adm-zip 実装も同性質であり非退行である。
是正は flags: 'wx' の 1 箇所。
MIN-2: writeZipStreaming がエントリ名を無検証で埋め込む
実測(Node 24 + strip-types で直接呼び出し): ../../../../etc/evil.txt / 絶対パス / C:\Windows\... / NUL 混入名がすべて通過し、unzip が展開時に警告を出す zip が生成できた。
ただし現行の唯一の呼び出し元は listTileFiles の実在 dirent 名由来で、.. と / は構造上混入できない ∴ 悪用経路は無い。
export された汎用関数であるため、将来の呼び出し元のためにガードを入れる。
関連
読み取り側の同系統の問題(extract-zip CVE-2026-56876)は #99 に分離した。**中身は同じ「zip のパストラバーサル」**である。
出どころ
サイクル 2026-08-25-mapedit-export-zip-failure の carried_backlog(B7 / B8)。セキュリティレビュー記録: docs/superpowers/reviews/2026-08-25-mapedit-export-zip-failure-security-review.md
軽量版セキュリティレビュー(2026-08-26、Critical 0 / Major 0 / Minor 2 / Info 6)で挙がった 2 件。いずれも非ブロッキングと判定済みだが、
zipWriterを他の経路へ広げる前に塞いでおきたい。MIN-1: 一時 zip の
createWriteStreamが symlink を追従するelectron/utils/zipWriter.ts:196が${outDir}.zipを既定 flags'w'で開く。Linux の共有/tmp(AppImage)では staging 中(分単位)に別のローカルユーザーが symlink を先置きすると、任意ファイルを上書きできる余地がある。macOS / Windows は per-user temp のため対象外。旧
adm-zip実装も同性質であり非退行である。是正は
flags: 'wx'の 1 箇所。MIN-2:
writeZipStreamingがエントリ名を無検証で埋め込む実測(Node 24 + strip-types で直接呼び出し):
../../../../etc/evil.txt/ 絶対パス /C:\Windows\.../ NUL 混入名がすべて通過し、unzipが展開時に警告を出す zip が生成できた。ただし現行の唯一の呼び出し元は
listTileFilesの実在 dirent 名由来で、..と/は構造上混入できない ∴ 悪用経路は無い。exportされた汎用関数であるため、将来の呼び出し元のためにガードを入れる。関連
読み取り側の同系統の問題(
extract-zipCVE-2026-56876)は #99 に分離した。**中身は同じ「zip のパストラバーサル」**である。出どころ
サイクル
2026-08-25-mapedit-export-zip-failureの carried_backlog(B7 / B8)。セキュリティレビュー記録:docs/superpowers/reviews/2026-08-25-mapedit-export-zip-failure-security-review.md