---
title: FR-158 SEMI E187 半導體設備資安查核框架 — 設計
status: 設計定案（2026-10-22），母卡 CM-3015、子卡 CM-3016～3020 已建，等工作坊派
relates: [FR-024, FR-045, FR-135, FR-153]
---

# FR-158 SEMI E187 半導體設備資安查核框架

## 1. 這是什麼（白話）

把數位發展部數位產業署 2026-03-10 公布的「以 SEMI E187 為基礎之半導體設備資安查核規範」v1.0 做成系統內建的合規框架，和 CMMC、CRA、ISO 27001 一樣可以建資源庫、起專案、逐條收證據、出結案報告。

跟 ISO 不同的是，這份**走匯入解析器（parser）**：顧問拿到新版 PDF 可以自己從「合規框架匯入」頁匯進來，不用等我們發版。出貨內建那份也是用同一支 parser 從 PDF 產出來的，再疊一層我們寫的摘要與建議證據。

## 2. 來源文件

| 檔 | 內容 | 用途 |
|---|---|---|
| `docs/reference/SEMI-E187/SEMI-E187-Validation-Criteria-v1.0-2026-03-10-CN.pdf` | 查核規範 v1.0，23 頁繁中。第 4 章型號一致性（3 條）、第 5 章技術查核（12 條，各帶官方代號 `E187.00-RQ-000NN-00` 與對應 SEMI E187 標準條款） | parser 唯一輸入、測試 fixture、seed 來源 |
| `docs/reference/SEMI-E187/半導體設備資安查核檢核表_範本_PUB.xlsx` | 檢核表範本三分頁：查核文件準備清單、合規檢核表（15 條短標題＋一句摘要）、系統強化說明範本 | 補充內容（短標題、摘要）與建庫文件範本的來源；**不當匯入標的** |

為什麼匯 PDF 不匯 Excel：Excel 每條只剩一句摘要，沒有查核步驟（AO 本體）、沒有 Note；匯入頁與 route 現在只收 `.pdf`；規範改版公布的是 PDF，Excel 是衍生物。

PDF 排版實測（pdfplumber）：本文 DFKaiShu 14pt、Note 10pt、頁碼 TimesNewRoman 10pt，字級可乾淨切開；無疊字、無上標污染（比 CMMC 單純）。

## 3. 框架結構

### 3.1 群組（5）

依規範第 1 章末段點名的 E187 四大基礎要求，加一群型號一致性：

| group_id | 標題 | 控制項 | 對應 E187 條款 |
|---|---|---|---|
| `E187-G1` | 設備型號一致性與出場品管 | 4.1、4.2、4.3 | 無（台灣驗證制度加的） |
| `E187-G2` | 作業系統支援 | 5.1、5.2 | 7.2 |
| `E187-G3` | 網路安全 | 5.3、5.4 | 8.2、8.3 |
| `E187-G4` | 端點保護 | 5.5、5.6、5.7、5.8、5.9、5.10 | 9.2、9.3、9.4、9.5 |
| `E187-G5` | 安全監控 | 5.11、5.12 | 10.2 |

群組不是從 PDF 解析出來的（PDF 沒有這層），是 parser 內的固定對照表（控制項號 → 群組）。PDF 改版多了 5.13 這類新號，對照表查無就落到依條款號推斷的群組；推不出來落「其他」群，parser 不中止。

### 3.2 控制項（15）

| control_id | 標題（Excel 短標題） | 官方代號 `source_identifier` | AO 數 |
|---|---|---|---|
| 4.1 | 設備適用性確認 | — | 1 |
| 4.2 | 設備型號 | — | 2 |
| 4.3 | 出場品管作業 | — | 2 |
| 5.1 | 對作業系統的支持 | E187.00-RQ-00001-00 | 4 |
| 5.2 | 作業系統安全性更新 | E187.00-RQ-00002-00 | 1 |
| 5.3 | 網路傳輸安全 | E187.00-RQ-00003-00 | 2 |
| 5.4 | 網路設定管理 | E187.00-RQ-00004-00 | 2 |
| 5.5 | 弱點緩解 | E187.00-RQ-00005-00 | 2 |
| 5.6 | 惡意軟體掃描 | E187.00-RQ-00006-00 | 2 |
| 5.7 | 反惡意軟體保護 | E187.00-RQ-00007-00 | 2 |
| 5.8 | 系統強化 (Hardening) | E187.00-RQ-00008-00 | 2 |
| 5.9 | 存取控制機制-帳號識別 | E187.00-RQ-00009-00 | 2 |
| 5.10 | 存取控制機制-權限管理 | E187.00-RQ-00010-00 | 3 |
| 5.11 | 日誌要求-事件紀錄 | E187.00-RQ-00011-00 | 2 |
| 5.12 | 日誌要求-紀錄類別 | E187.00-RQ-00012-00 | 2 |

合計 31 個 AO。PDF 裡 5.7／5.8、5.9／5.10、5.11／5.12 標題相同（都只寫條款名），parser 照 PDF 產標題，seed 用 Excel 短標題覆蓋；使用者自己匯時可在 Step 2 預覽改名。

### 3.3 AO（31）＝查核步驟

每條底下 `5.x.1`、`5.x.2`… 各成一個 AO，prose 用步驟原文（含「若是續查／若否不符合」判定句與 a./b./c. 子項）。最後一步「記錄以下內容之一」不是查核，不成 AO，收成控制項 props `verdict_options`（符合／不符合／不適用）。

AO `part_id` = `<control_id>_obj.<N>`（與 CRA／ISO 同），例 `5.1_obj.1`。props 帶 `{"name":"step","value":"5.1.1"}` 保留原步驟號。

### 3.4 Note 與文件清單去哪

| 來源 | 落點 | 誰產 |
|---|---|---|
| 各步驟的 Note1～Note9 | 該 AO 底下的子 `guidance` part（`parent_id` 指 AO） | parser |
| 3.2.3 查核文件準備清單（13 種文件 → 相關查核條款） | 控制項層 `guidance` part，寫成「查核依據文件：…（●必須／○如需）」 | parser |
| 一句話摘要（這條在查什麼） | 控制項 `statement` part | **補充層**（parser 留空） |
| 每個 AO 的建議證據（交付物、須呈現） | 疊在該 AO 子 guidance 的 Note 前面 | **補充層** |
| 英文 | `_trans` 表（主語繁中、英文為譯文，與 CRA／ISO 相反） | **補充層** |

## 4. 決策（2026-10-22 決策者裁，照首腦預設）

| # | 決策 | 選擇 | 被排除的與原因 |
|---|---|---|---|
| D1 | 控制項代號 | `4.1`～`5.12`（Excel 條文編號，顧問填表認的號）；官方 RQ 碼放 `source_identifier` 與 props | 直接用 RQ 碼：4.x 三條沒有 RQ 碼，會混兩套 |
| D2 | AO 顆粒度 | 一步驟一 AO，31 個 | 一條一 AO：5.1 四步擠成一條，證據分不開、不適用記不了 |
| D3 | PDF 隨包 | **不進包**；版本頁 `reference_url` 指 SEMI 官方頁 `https://www.semi.org/zh/SEMI_E187-Specification_for_Cybersecurity_of_Fab_Equipment`（決策者 2026-10-22 指定）；確認散布權後開新 seed 補 | 直接進包：封面載明與 SEMI 共同擁有，FR-153 ISO 教訓 |
| D4 | 建庫預設客戶視角 | 設備商自評、送驗前準備 | 檢測實驗室／晶圓廠視角：等 PM 確認情境再調 |
| D5 | PDF_PARSER 下拉死選項 | ISO_27002／NIST 兩支共三個順手停用（`enable=0`） | 不動：選了 400 |
| D6 | 匯入 PDF 還是 Excel | PDF（§2） | — |
| D7 | 補充層放哪 | BE `scripts/semi_e187/content.py`，只隨 seed 出貨；匯入頁匯進來的是純 parser 結果 | 把補充塞進套件 parser：手寫內容進套件與 CMMC／ISO 不一致 |
| D8 | 主語 | 繁中為主、英文譯文 | — |
| D9 | 框架代號 | `SEMI_E187`，版本 `1.0`，release_date `2026-03-10` | — |

## 5. 系統現況與要補的缺口

### 5.1 既有可直接用

- parser 工廠 `jedi_oscal_v2/infra/adapter/oscal_parser_factory.py`：`TYPE` dict 加一列即接上匯入頁。
- `BaseParserAdapter`：`_resolve_pages`／`clean_text`／`_assert_page_count` 共用。
- 匯入頁 parse → Step 2 預覽（可改名、刪、改 description／guidance）→ confirm → `CatalogService.add_catalog`。
- 判定狀態：`met／not_met／not_applicable` 系統既有，E187 的三選一直接吃。
- `framework_versions.reference_url`（jedi-oscal-v2 019 加的欄位）。
- `framework_library_defaults` REGISTRY：加 `semi_e187.py` 一檔即接上建庫。

### 5.2 要補的缺口（匯入管線丟資料）

首腦核對（2026-10-22）：

- `app/oscal/service/framework_parse_job_service.py:433` `_tree_to_dict`：assessments 只帶 `name`，`description` 永遠 None；controls 不帶 `source_identifier`／props。
- 同檔 `:500` `_persist_catalog`：`source_identifier=c.get("control_id")` 寫死等於代號；AO 只寫 `_obj.N` 一層，沒有子 guidance；不寫 props。
- 套件 `jedi_oscal_v2/app/service/catalog/catalog_service.py:110` `add_catalog`：parts 平走一層 `self._part_repo.add(part)`，**不處理 `parent_id`**（子 part 無從接線）。
- CRA／ISO 是 seed 直寫 DB 所以沒踩到；CMMC 沒有 AO 子層所以沒踩到。

E187 的 Note 要掛在 AO 底下、RQ 碼要留住，這三處都要補（見 §7 卡 B）。FE Step 2 預覽的 AO 段已有 `FrameworkArticleAoGuidance.vue`（讀 AO 的 guidance），資料接上即顯示；要確認 Step 2 用的是同一元件。

### 5.3 語言

匯入頁 Step 1 已有語言選擇（`language_code`），E187 選 `zh_Hant_TW`。主語繁中是新情況（CRA／ISO 主語 en）：卡 C 要驗 `en` 使用者看框架時 `_trans` 有英文就顯示英文、沒有就 fallback 主表繁中。

## 6. Parser 規格（卡 A）

檔：`jedi_oscal_v2/infra/adapter/semi_e187/semi_e187_parser_adapter.py`，類 `SemiE187Adapter(BaseParserAdapter)`。`ParserAdapterType.SEMI_E187 = "SEMI_E187"`，factory `TYPE` 加一列。

### 6.1 `pdf_parser` → `list[dict]`

1. pdfplumber 逐頁 `extract_words(extra_attrs=["fontname","size"])`，按 `top` 組行；**size < 12 的字歸 Note 流**（本文 14、Note 10；門檻用實測值，寫成有註解的常數），頁碼行（`^\d+/\d+$`）丟掉。
2. 只處理第 4、5 章：從第一個 `^4\s+設備型號一致性` 標題起，到 `^6\s+參考資料` 止。第 3.2.3 文件清單表另用 `page.extract_tables()` 抓（實測第 6～7 頁可抓到 4 欄：項目／文件名稱／必要性／相關查核條款）。
3. 控制項標題：`^(\d\.\d{1,2})\s*(?:\[(E187\.\d{2}-RQ-\d{5}-\d{2})\])?\s*(?:\((條款\s*[\d.]+)\s*([^)]*)\))?\s*(.*)$`。4.x 沒有中括號與小括號，標題在尾段；5.x 標題取小括號內條款名。
4. 步驟：`^(\d\.\d{1,2}\.\d)\s*(.*)`。步驟內文含子項 `^[a-z]\.\s`、判定句「若是…若否…」，全部併進 prose，換行保留為空格。遇「記錄以下內容之一」→ 收 `a. 符合` 等成 `verdict_options`，該步不成 AO。
5. Note：Note 流中 `^Note\s*(\d+)\s*[：:]\s*(.*)` 起一條，續行併入；歸屬「最近一個步驟」。表格型 Note（5.8 Note1 強化領域表）照行文字收，不求還原表格。
6. 群組：固定對照 `{4.x: G1, 5.1/5.2: G2, 5.3/5.4: G3, 5.5～5.10: G4, 5.11/5.12: G5}`；查無則依條款號首位（7→G2、8→G3、9→G4、10→G5），再查無落 `E187-G9 其他`。

raw record：

```python
{
  "group_code": "E187-G2", "group_name": "作業系統支援",
  "control_id": "5.1", "rq_code": "E187.00-RQ-00001-00",
  "clause": "7.2", "title": "對作業系統的支持",
  "steps": [{"step_id": "5.1.1", "text": "詢問申請者或檢視設備規格文件，…若否，則依 2.1.5 原則…", "notes": ["Note1：…"]}, ...],
  "verdict_options": ["符合", "不符合", "不適用"],
  "documents": [{"name": "設備規格文件", "required": True}, {"name": "…LTS 證明文件", "required": False}],
}
```

### 6.2 `convert_to_oscal_catalog_entity`

- group：`group_id=group_code`、`title=group_name`、`class_="semi-e187"`。
- control：`control_id`、`title`、`source_identifier=rq_code or control_id`、`class_="semi-e187"`、`props=[{"name":"rq-code",...},{"name":"e187-clause",...},{"name":"verdict-options","value":"符合|不符合|不適用"}]`。
- parts：`statement` **不產**（parser 無摘要可寫）；每步一個 `assessment-objective` part（`part_id=<cid>_obj.<N>`、`props=[{"name":"step","value":"5.1.1"}]`），其 Note 合成一個子 `guidance` part 掛 `part.children`（transient，`parent_id` 由 persistence 接）；文件清單非空時產控制項層 `guidance` part（`part_id=<cid>_gdn`）。

### 6.3 `excel_parser`／`gen_excel_file`

沿用 CMMC 的 `practices_raw` 平表形狀（`item_type` 加 `note`／`document`），round-trip 測試即可，不另設計。

### 6.4 測試（套件 `tests/catalog/`）

fixture 用 `docs/reference/SEMI-E187/…CN.pdf` 複製進套件 `tests/fixtures/`。斷言：15 條、31 AO、5 群、代號與 RQ 碼逐條對 §3.2 表、5.1 有 4 步且 5.1.4 prose 含「LTS」、5.5 的 Note 共 9 條、文件清單 13 筆且 5.5 掛到「設備弱點掃描報告」與「弱點管理機制說明文件」、`verdict_options` 4.1 為 2 項 5.1 為 3 項。突變：把字級門檻拿掉要紅（Note 混進 AO prose）。

## 7. 拆卡

| 批 | 卡 | 改哪 | 做什麼 | Model／Effort |
|---|---|---|---|---|
| 1 | **A** SEMI_E187 parser adapter | jedi-oscal-v2 `infra/adapter/semi_e187/`、`common/code/parser_adapter_type.py`、`infra/adapter/oscal_parser_factory.py`、`tests/catalog/`、`tests/fixtures/` | §6 | opus／high |
| 1 | **B** 匯入管線補 AO 子層與來源代號 | jedi-oscal-v2 `app/service/catalog/catalog_service.py`；BE `app/oscal/service/framework_parse_job_service.py`；FE Step 2 預覽確認 | §5.2 三處：`add_catalog` 接 `part.children` 的 `parent_id`；`_tree_to_dict` 帶 AO description（子 guidance）、control `source_identifier`／props；`_persist_catalog` 寫回；confirm 的 overrides 讓 `assessments[].description` 可編 | opus／medium |
| 2 | **C** 補充內容＋seed 020＋選單＋reference_url | BE `scripts/semi_e187/content.py`、`scripts/gen_semi_e187_seed.py`；jedi-oscal-v2 `migrations/020-semi-e187-catalog-seed.sql`；BE 主線 `phase=seed` migration（PDF_PARSER 加 `SEMI_E187`、停用 ISO／NIST） | 跑 parser 吃 PDF → 疊 content（短標題、摘要 statement、AO 建議證據、英文譯文）→ 產 020；DEV 套兩次計數不變 | opus／high |
| 2 | **D** 建庫預設 | BE `app/oscal/service/framework_library_defaults/semi_e187.py`、`__init__.py` REGISTRY、`app/oscal/templates/semi_e187/` | 表單設定（設備型號、申請者、OS 與版本、OS 終止支援日、查核基準日、是否型號一體驗證、聯網功能有無）、參與方空殼（申請者／檢測實驗室）、系統強化說明文件範本（Excel 第 3 分頁轉 docx） | opus／medium |
| 3 | **E** 收尾 | BE `pyproject.toml` pin、spec-site、`docs/features/README.md`、FR-158 SUMMARY | 還原 pin（發版步驟列出，執行前回寫問決策者）、SPEC 頁、README 列、收尾紀錄 | sonnet／medium |

第 1 批 A／B 同在 jedi-oscal-v2 但不同檔（A 在 `infra/adapter/`，B 在 `app/service/catalog/`），可平行。第 2 批 C／D 不同檔可平行；D 的手測在 C 未完成前，用匯入頁匯 PDF 建一個 `SEMI_E187` 框架頂替（第 1 批已完成即可）。

## 8. 驗收（首腦收口時親自做）

- 套件 tests 全綠；BE 守衛測試全綠。
- DEV 匯入頁選 SEMI_E187＋PDF＋繁中 → Step 2 預覽 5 群／15 條／31 AO，AO 下看得到 Note；confirm 後 DB `catalog_control_parts` 有 `parent_id` 非空的 guidance 列、controls 的 `source_identifier` 是 RQ 碼。
- seed 020 套兩次計數不變；`en` 使用者看框架顯示英文、缺的 fallback 繁中。
- 建 SEMI_E187 資源庫：表單設定、兩個參與方空殼、強化說明範本到位。
- PDF_PARSER 下拉只剩 CMMC 2.0、SEMI E187 兩項。

## 9. 範圍外

- 查核報告格式（規範 1.1.2 說查核申請、計畫、報告由實驗室自建）。
- SEMI E187 標準本體（SEMI 付費文件）與 Reference Practice／Check List 內容。
- 匯入頁帶補充層（D7）。
- ISO 補 parser（決策者裁不補）。
