Release v2.2.0
這一版讓題目可以「開源」:學習者不再只能從外部戳,而是能直接讀應用程式的原始碼找問題。白箱功能與第一題一起上架,另外修掉四個會被看見的缺陷——包括 Code 面板一直沒有忠實顯示 Python 的輸出。
✨ 新增 (Added)
- 白箱題型:題目可以把原始碼攤開給學習者讀。題目在 frontmatter 宣告之後,應用程式原始碼會以唯讀檢視器呈現在新的 Source 分頁,支援語法高亮、字級調整與搜尋。展示副本在 build 期經過遮罩處理;另可列出額外要展示的檔案路徑,例如掛進映像檔的設定檔,讓一題同時攤開好幾個檔 (#50)
- 白箱首題「Already Authenticated」(難度 easy)。Northwind 內部事故主控台的白箱滲透測試委託,忠實重現一個較新的真實 CVE 的根因:一個為了防止中介層無限遞迴而設的計數器,被當成了信任訊號。門檻與設定住在掛進映像檔的閘道設定檔裡、應用程式只讀它,所以要讀兩個檔才拼得出完整圖像——這正是多檔展示的用處 (#56)
🐛 修復 (Fixed)
- 部分題目一出生就打不開。題目金鑰產生器的處理順序讓混淆步驟有機率把剛注入的題目資料整段丟掉,中獎與否在該題產生的當下就決定、之後每次載入都一樣壞。改為先混淆再注入,並在上架前讀回驗證 (#52)
- Code 面板不再把多行輸出黏成一行。面板接收 Python 輸出的方式是以行為單位的,而那個介面會把每一行的換行去掉;更嚴重的是沒有換行結尾的內容根本不會送達,
print(..., end='')印出來的東西完全看不到。改為以位元組接收、跨區塊保留解碼狀態,並在每次執行結束後主動要求輸出 (#58) - 題目頁面的字型退回襯線體。頁面骨架把樣式表當成一般資料傳進會自動轉義的樣板,字型名稱的引號被換成字元參照,而
<style>不會把它解回來,整條宣告因此失效。五個題目受影響 (#57) - 白箱題的原始碼不再附帶一份答案。該題檔案開頭的說明直接點名了漏洞類型與目標,中介層還有一段註解把非預期解整段寫出來。那些是出題者寫給自己看的、在不展示原始碼的題目無妨,白箱題卻會整份出貨。改寫成真正的服務說明,並刻意保留守門機制存在的營運理由——那是推理的素材,不是答案 (#59)
- 以 production 模式安裝時會缺少檢視器需要的套件。原始碼檢視器在執行期動態載入的一個套件被歸在開發相依,完整安裝的 CI 看不出來。連同一支守門測試一起修,往後任何執行期動態載入的套件都必須列在正式相依裡 (#54)
🗑️ 內部 (Internal)
What's Changed
- ✨ feat: 接上白箱(source_visible)功能——展示副本經 build 期遮罩後以 CodeMirror 唯讀檢視器呈現 by @CXPhoenix in #50
- 📝 docs: archive whitebox-source-viewer——delta 套進 live spec 並補齊 @trace 歸屬 by @CXPhoenix in #51
- 🐛 fix: keygen 先 mutate template 再注入 chall-data,並在上架前讀回驗證 payload——修掉部分 slug 一出生就沒有 payload 的缺陷 by @CXPhoenix in #52
- 📝 docs: archive keygen-mutate-before-inject——obfuscation 管線的 requirement 套進 live spec 並補上 @trace by @CXPhoenix in #53
- 🐛 fix: 把 @codemirror/search 搬到 dependencies,補上執行期 import 的守門測試 by @CXPhoenix in #54
- 🔧 chore: archive codemirror-search-runtime-dep by @CXPhoenix in #55
- ✨ feat: 新增白箱題 already-authenticated——中介層遞迴防護的授權繞過 by @CXPhoenix in #56
- 🐛 fix: 修好五個題目被 autoescape 轉義的樣式表 by @CXPhoenix in #57
- 🐛 fix: Code 面板顯示 Python 實際寫出的輸出,測試讀到完整輸出 by @CXPhoenix in #58
- 🐛 fix: 白箱題的原始碼不再附帶一份答案 by @CXPhoenix in #59
- 🚀 release: 2.2.0——白箱題型上線與四個看得見的修正 by @CXPhoenix in #60
- 🚀 release: 2.2.0 上 production——白箱題型與白箱首題,Code 面板輸出保真 by @CXPhoenix in #61
Full Changelog: v2.1.2...v2.2.0