TronClass 一系列 API 只驗證登入不驗證權限,導致 BOLA / IDOR 與老師權限提升 - HITCON ZeroDay

Vulnerability Detail Report

Vulnerability Overview

  • ZDID: ZD-2026-00839
  •  發信 Vendor: 台灣智園有限公司(TronClass 開發商)
  • Title: TronClass 一系列 API 只驗證登入不驗證權限,導致 BOLA / IDOR 與老師權限提升
  • Introduction: 多支 API 只驗證「有沒有登入」卻不驗證「資源是不是你的」,任一登入學生即可讀取他人課程點名名單/個資、簽到碼、考試統計,甚至把任意帳號提升為任意課程的老師。

處理狀態

目前狀態

公開
Last Update : 2026/07/21
  • 新提交
  • 已審核
  • 已通報
  • 已修補
  • 未複測
  • 公開

處理歷程

  • 2026/06/11 19:30:14 : 新提交 (由 Wayne Chen 更新此狀態)
  • 2026/06/11 23:02:52 : 新提交 (由 Wayne Chen 更新此狀態)
  • 2026/06/12 10:32:42 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/07/06 17:01:32 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/07/06 17:01:32 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/07/06 17:01:32 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2026/07/13 10:36:04 : 已修補 (由 組織帳號 更新此狀態)
  • 2026/07/21 03:00:19 : 公開 (由 HITCON ZeroDay 平台自動更新)

詳細資料

  • ZDID:ZD-2026-00839
  • 通報者:fishy (Wayne Chen)
  • 風險:嚴重
  • 類型:存取控制缺陷 (Broken Access Control)

參考資料

攻擊者可經由該漏洞取得、修改、刪除系統中的其他使用者的資料,或連線至高權限使用者的頁面。

OWASP Top 10 - 2017 A5 - Broken Access Control
https://www.owasp.org/index.php/Top_10-2017_A5-Broken_Access_Control

CWE-284: Improper Access Control
https://cwe.mitre.org/data/definitions/284.html
(本欄位資訊由系統根據漏洞類別自動產生,做為漏洞參考資料。)

相關網址

https://tronclass.ntou.edu.tw/api/course/{courseId}/invites
https://tronclass.ntou.edu.tw/api/rollcall/{rollcallId}/student_rollcalls
https://tronclass.ntou.edu.tw/api/course/{courseId}/rollcall/{rollcallId}/qr_code
https://tronclass.ntou.edu.tw/api/course/{courseId}/access_code
https://tronclass.ntou.edu.tw/exam/{examId}/export/stat-info

敘述

漏洞種類

Broken Object Level Authorization (BOLA / IDOR) 與 Broken Function Level Authorization(垂直權限提升),對應 OWASP API Security Top 10 之 API1:2023 與 API5:2023。

共通根因

TronClass 多支 API 只驗證 authentication(有沒有登入),沒驗證 authorization(這個資源/操作是不是你的)。部分為 deprecated 舊 endpoint 未被正確下線,導致物件層級的權限檢查整個被跳過。請求中的 courseId / rollcallId / examId 只是遞增數字,換成別人的照樣回資料。

任一合法登入的「學生」session cookie 即可呼叫以下 API(QR code 那支需任一教師帳號)。


1.(最嚴重,Critical)把任意帳號變成任意課程的老師

POST /api/course/{courseId}/invites

此 route 未驗證呼叫者是否為該課老師。一般「學生」帳號帶合法 session 即可發出 instructor 邀請。Request body:

json { "emails": ["[email protected]"], "invite_type": "instructor" } ​

  • 回應 {"message":"邀請已送出"} 即代表成功。
  • 被邀請者約 3~10 分鐘收到 App / email 邀請,在已登入 TronClass 的瀏覽器分頁開啟連結、按「進入課程」即成為該課老師。
  • 若原老師非課程建立者(課程多由組織 admin 建立),新老師甚至能移除原老師。
  • 條件:課程若有設定系所,需「同系所且同組織」才能邀請成功。

2.(High)取得單場點名完整名單(含個資 + 簽到碼)

GET /api/rollcall/{rollcallId}/student_rollcalls(referer 需帶 courseId)

  • 預期僅該課老師可看完整名單;實際上一般學生即可讀任意場次。
  • 外洩 (a):每位學生姓名、學號 user_no、系所、班級、請假狀態。
  • 外洩 (b):數字點名簽到碼 number_code 直接出現在回應,等於任何人都能拿碼自行簽到。

3.(High)取得進行中 QR 點名的簽到 token

GET /api/course/{courseId}/rollcall/{rollcallId}/qr_code

  • 只驗證呼叫者「是某課老師」,未驗證是「此課」老師。任一教師帳號即可讀取他課進行中 QR 點名的 data token,拿到後可代簽(不需到場、不需掃實體 QR)。
  • 前提:目標 rollcallId 為一場進行中的 QR 點名。

4.(High)取得任意課程加入碼

GET /api/course/{courseId}/access_code

  • 加入碼預期僅該課老師於課程編輯頁可見;實際上帶任意合法 session 即可讀任意 courseId 的加入碼,進而自行加入任意課程。

5.(High)下載任意考試統計(含學生個資)

GET /exam/{examId}/export/stat-info

  • 未驗證呼叫者與該 exam 的關係,帶任意合法 session 且 examId 存在即可下載該場考試統計 xlsx。可透過遞增 examId 列舉全校考試統計。

影響

  • 全校學生個資(姓名、學號、系所、班級、請假紀錄)外洩。
  • 點名簽到碼 / QR token 外洩,可代簽、破壞點名公正性。
  • 考試統計與學生作答資料外洩。
  • 垂直權限提升:任一學生可成為任意課程老師,並可能移除原老師、竄改成績、發布公告(已列為禁止行為,僅說明影響範圍)。

重現方式

  1. 用一般學生帳號登入學校 TronClass,從 DevTools 取得 session cookie。
  2. 對上述任一 endpoint 帶該 cookie 發出請求,把路徑中的 ID 換成非自己所屬課程/考試的 ID。
  3. 觀察到 API 仍回傳本應無權存取的資料(或邀請成功)。

本通報僅供負責任揭露用途,未對他人資料進行竄改或散布。

更多詳情(完整 API 清單 / OpenAPI 規格)請見: https://github.com/WeiWeiK/tronclass-api-bug

擷圖

留言討論

聯絡組織

 發送私人訊息
您也可以透過私人訊息的方式與組織聯繫,討論有關於這個漏洞的相關資訊。
;