本卡屬 FR-075(母卡 CM-1546)。S2 掃描(CM-1548)0 發現,但首腦復核後判定第一輪的 M-1/M-2/M-3 三條同根因問題仍然成立,工具沒報是因為程式碼註解把它寫成刻意設計。本卡由首腦開,不是掃描產出。

問題是什麼(白話)

資料庫的租戶隔離(RLS)靠 session_scope() 在每次查詢前設定「這個人是誰、能看哪些租戶」。現在的判定有兩個 fail-open 的洞:

jedi-iam 的 signed_token.py:83-100 _set_minimal_context() 刻意把 tenant_id 設成 None 來取得 super admin,docstring 寫明是為了「避免掛 decorator 反而縮小資料可見範圍」。這是依賴洞來運作,洞補了它會壞,所以要一起改。

為什麼 S2 掃描沒報

signed_token.py 確實在 S2 的 8 檔範圍內(runner 報告說在範圍外是誤判)。工具沒報的原因是程式碼註解把 fail-open 寫成刻意設計,研究員讀到「與原本既有行為一致」就接受了。這正是「工具會被註解說服」的例子——註解說是設計不代表設計是對的

在哪裡

~/Projects/Jedicogy/module/jedi-python-package/jedi-common/jedi_common/session/database/db.py:100-104    is_super 判定(tenant_id falsy 即 super)
~/Projects/Jedicogy/module/jedi-python-package/jedi-common/jedi_common/session/database/db.py:115-119    無 context 即 super admin
~/Projects/Jedicogy/module/jedi-python-package/jedi-iam/jedi_iam/authz/signed_token.py:83-100            _set_minimal_context(依賴上述洞)

怎麼修——分三步,順序不能反

第一步:盤點誰在依賴 fail-open。這是本卡最重要的一步,做錯會讓一堆功能靜默壞掉。

第二步:把「super admin」改成明確的正向訊號,不再從「缺值」推論。

第三步:修 signed_token