---
title: "รายงานผลการตรวจสอบช่องโหว่ (Vulnerability Scan)"
titleEn: "Vulnerability Scan Report"
clauses: ["4.8.1", "7.2.6", "ก.2.2.2"]
phase: 2
category: "รายงานอัตโนมัติ"
generated: true
generatedAt: "2026-10-03T01:52:40Z"
---

> สร้างอัตโนมัติเมื่อ 2026-10-03T01:52:40Z

# รายงานผลการตรวจสอบช่องโหว่ (Vulnerability Scan)

**อ้างอิง TOR:** ข้อ 4.8.1 (Vulnerability Scan + รายงาน + ไม่มี High/Critical), ข้อ 7.2.6 (เอกสารส่งมอบงวดที่ 2), ข้อ ก.2.2.2 (ไม่มี High/Critical ก่อนใช้งานจริง)

รายงานนี้สร้างโดย `scripts/security/npm-audit-report.ts` (`npm run report:security`) จากผลจริงของ `npm audit --json` ซึ่งเทียบ dependency ทั้งหมดใน `package-lock.json` กับฐานข้อมูล GitHub Advisory — สคริปต์ **ไม่** แก้ไข dependency ใด ๆ (ไม่รัน `npm audit fix`)

## 1. สรุปผล

| รายการ | ค่า |
|---|---|
| ผลตาม TOR 4.8.1 / ก.2.2.2 | **ไม่ผ่าน — มี High/Critical คงค้าง 9 รายการ: @next/eslint-plugin-next (high), @prisma/config (high), braces (high), deepmerge-ts (high), eslint-config-next (high), fast-glob (high), micromatch (high), postcss (high), prisma (high)** |
| วันที่สแกน | 2026-10-03T01:52:40Z |
| เครื่องมือ | npm audit (npm 11.17.0, Node v24.19.0) |
| จำนวน dependency ที่ตรวจ | ทั้งหมด 841 (prod 293, dev 488, optional 164, peer 31) |
| จำนวน package ที่มีช่องโหว่ | 10 |
| High/Critical คงค้าง | 9 |

## 2. จำนวนตามระดับความรุนแรง

| ระดับ | ทั้งหมด | Production (`--omit=dev`) | เฉพาะ dev |
|---|---:|---:|---:|
| critical | 0 | 0 | 0 |
| high | 9 | 4 | 5 |
| moderate | 1 | 1 | 0 |
| low | 0 | 0 | 0 |
| info | 0 | 0 | 0 |
| รวม | 10 | 5 | 5 |

หมายเหตุ: นับเป็นจำนวน package ที่ได้รับผลกระทบ (รูปแบบเดียวกับ `npm audit`) — package หนึ่งอาจมีหลาย advisory และ advisory เดียวอาจทำให้ package ที่พึ่งพามันถูกนับด้วย คอลัมน์ Production คือ package ที่ยังปรากฏเมื่อสแกนแบบ `npm audit --omit=dev`

## 3. รายการ Advisory

| Package | ระดับ | ขอบเขต | Direct | Advisory | ช่วงเวอร์ชันที่กระทบ | การแก้ไขที่มี |
|---|---|---|---|---|---|---|
| `@next/eslint-plugin-next` | high | dev เท่านั้น | ไม่ (transitive) | รับผลจาก fast-glob | `>=14.3.0-canary.0` | ไม่มีแพตช์ในสายเวอร์ชันปัจจุบัน — npm เสนอเพียงการลดเวอร์ชัน eslint-config-next 15.5.27 → 14.2.35 (semver-major) |
| `@prisma/config` | high | production | ไม่ (transitive) | รับผลจาก deepmerge-ts | `6.13.0-dev.1 - 8.1.0-dev.4` | ไม่มีแพตช์ในสายเวอร์ชันปัจจุบัน — npm เสนอเพียงการลดเวอร์ชัน prisma 6.19.3 → 6.12.0 (semver-major) |
| `braces` | high | dev เท่านั้น | ไม่ (transitive) | [braces vulnerable to stack-exhaustion denial of service through deeply nested patterns [high]](https://github.com/advisories/GHSA-vfj7-8cjw-p6xm) | `*` | ไม่มีแพตช์ในสายเวอร์ชันปัจจุบัน — npm เสนอเพียงการลดเวอร์ชัน eslint-config-next 15.5.27 → 14.2.35 (semver-major) |
| `deepmerge-ts` | high | production | ไม่ (transitive) | [DeepmergeTS has stack exhaustion when merging recursive object graphs [high]](https://github.com/advisories/GHSA-ggr8-5vv4-36mx) | `<8.0.0` | ไม่มีแพตช์ในสายเวอร์ชันปัจจุบัน — npm เสนอเพียงการลดเวอร์ชัน prisma 6.19.3 → 6.12.0 (semver-major) |
| `eslint-config-next` | high | dev เท่านั้น | ใช่ | รับผลจาก @next/eslint-plugin-next | `>=14.3.0-canary.0` | ไม่มีแพตช์ในสายเวอร์ชันปัจจุบัน — npm เสนอเพียงการลดเวอร์ชัน eslint-config-next 15.5.27 → 14.2.35 (semver-major) |
| `fast-glob` | high | dev เท่านั้น | ไม่ (transitive) | รับผลจาก micromatch | `*` | ไม่มีแพตช์ในสายเวอร์ชันปัจจุบัน — npm เสนอเพียงการลดเวอร์ชัน eslint-config-next 15.5.27 → 14.2.35 (semver-major) |
| `micromatch` | high | dev เท่านั้น | ไม่ (transitive) | รับผลจาก braces | `>=0.2.0` | ไม่มีแพตช์ในสายเวอร์ชันปัจจุบัน — npm เสนอเพียงการลดเวอร์ชัน eslint-config-next 15.5.27 → 14.2.35 (semver-major) |
| `postcss` | high | production | ไม่ (transitive) | (1) [PostCSS has XSS via Unescaped &lt;/style&gt; in its CSS Stringify Output [moderate]](https://github.com/advisories/GHSA-qx2v-qp2m-jg93) (2) [PostCSS: Arbitrary file read and information disclosure via attacker-controlled sourceMappingURL in CSS comments [high]](https://github.com/advisories/GHSA-6g55-p6wh-862q) (3) [PostCSS: incomplete fix of GHSA-6g55-p6wh-862q — attacker-controlled sourceMappingURL reads arbitrary .map files when `from` is unset [moderate]](https://github.com/advisories/GHSA-fxqj-rqcc-2cmp) (4) [PostCSS: Path Traversal in Previous Source Map Auto-Loading (sourceMappingURL) leads to Arbitrary .map File Disclosure [high]](https://github.com/advisories/GHSA-r28c-9q8g-f849) | `<=8.5.22` | มี แต่เป็น breaking — ต้องเปลี่ยนเป็น next@16.3.8 (จาก 15.5.27) (semver-major) |
| `prisma` | high | production | ใช่ | รับผลจาก @prisma/config | `6.13.0-dev.1 - 8.1.0-dev.4` | ไม่มีแพตช์ในสายเวอร์ชันปัจจุบัน — npm เสนอเพียงการลดเวอร์ชัน prisma 6.19.3 → 6.12.0 (semver-major) |
| `next` | moderate | production | ใช่ | รับผลจาก postcss | `9.3.4-canary.0 - 16.3.0-preview.10` | มี แต่เป็น breaking — ต้องเปลี่ยนเป็น next@16.3.8 (จาก 15.5.27) (semver-major) |

## 4. แผนการแก้ไข (Remediation Plan)

| ลำดับ | ระดับสูงสุด | Package ที่เกี่ยวข้อง | สิ่งที่ต้องทำ | กำหนดแก้ (SLA) |
|---:|---|---|---|---|
| 1 | high | `@next/eslint-plugin-next`, `braces`, `eslint-config-next`, `fast-glob`, `micromatch` | npm เสนอเพียงการลดเวอร์ชันเป็น eslint-config-next@14.2.35 ซึ่งไม่ใช่ทางแก้ที่ใช้ได้ — ใช้ `overrides` ใน package.json ปัก dependency ย่อยที่มีแพตช์แล้ว หรืออัปเกรดเมื่อผู้พัฒนาต้นทางออกเวอร์ชันที่แก้ไข แล้วรันชุดทดสอบ | ภายใน 24 ชม. นับจากบันทึก Defect และต้องปิดก่อนใช้งานจริง (ก.2.2.2) |
| 2 | high | `@prisma/config`, `deepmerge-ts`, `prisma` | npm เสนอเพียงการลดเวอร์ชันเป็น prisma@6.12.0 ซึ่งไม่ใช่ทางแก้ที่ใช้ได้ — ใช้ `overrides` ใน package.json ปัก dependency ย่อยที่มีแพตช์แล้ว หรืออัปเกรดเมื่อผู้พัฒนาต้นทางออกเวอร์ชันที่แก้ไข แล้วรันชุดทดสอบ | ภายใน 24 ชม. นับจากบันทึก Defect และต้องปิดก่อนใช้งานจริง (ก.2.2.2) |
| 3 | high | `postcss`, `next` | เปลี่ยนเวอร์ชันเป็น next@16.3.8 (semver-major — `npm audit fix --force`) ต้องทดสอบ regression ทั้งระบบก่อนนำขึ้น หรือใช้ `overrides` ปักเวอร์ชัน dependency ย่อยที่แก้แล้ว | ภายใน 24 ชม. นับจากบันทึก Defect และต้องปิดก่อนใช้งานจริง (ก.2.2.2) |

**การจำแนก High/Critical:**

- อยู่ใน dependency tree ของ production: `@prisma/config`, `deepmerge-ts`, `postcss`, `prisma`
- เฉพาะ devDependencies: `@next/eslint-plugin-next`, `braces`, `eslint-config-next`, `fast-glob`, `micromatch`
- แก้ได้ด้วย `npm audit fix` แบบไม่ breaking: ไม่มี
- ต้องเปลี่ยนเวอร์ชันแบบ breaking (semver-major): `postcss` → next@16.3.8
- ไม่มีแพตช์ในสายเวอร์ชันปัจจุบัน (npm เสนอเพียงการลดเวอร์ชัน): `@next/eslint-plugin-next` (eslint-config-next@14.2.35), `@prisma/config` (prisma@6.12.0), `braces` (eslint-config-next@14.2.35), `deepmerge-ts` (prisma@6.12.0), `eslint-config-next` (eslint-config-next@14.2.35), `fast-glob` (eslint-config-next@14.2.35), `micromatch` (eslint-config-next@14.2.35), `prisma` (prisma@6.12.0)
- ยังไม่มีแพตช์: ไม่มี

**การประเมินการเปิดรับความเสี่ยงเบื้องต้น (บันทึกของทีมพัฒนา — ไม่ได้ลดระดับความรุนแรงที่รายงานข้างต้น และต้องได้รับการยืนยันจากผู้ตรวจ):**

- `@prisma/config`: ถูกโหลดโดย Prisma CLI เท่านั้น เพื่ออ่านไฟล์ config ของโครงการเอง (ไม่ใช่ข้อมูลจากผู้ใช้)
- `deepmerge-ts`: ถูกเรียกผ่าน `@prisma/config` ของ Prisma CLI เพื่อ merge ไฟล์ config ของโครงการ — ไม่มีการ merge ข้อมูลที่ผู้ใช้ส่งเข้ามา
- `postcss`: สำเนา postcss ที่ติดมากับ `next` ใช้ประมวลผล CSS ของโครงการเองตอน build/dev — ระบบไม่รับ CSS หรือ source map จากผู้ใช้มาประมวลผล
- `prisma`: Prisma CLI ใช้ตอน build/deploy (`prisma migrate deploy`, `prisma generate`) ไม่อยู่ในเส้นทางรับคำขอของผู้ใช้ — runtime ใช้ `@prisma/client` ซึ่งไม่อยู่ในรายการช่องโหว่นี้
- `next`: ถูกนับเพราะพึ่งพา postcss รุ่นที่มีช่องโหว่ (ดูแถว postcss)

## 5. การบันทึก Defect

มี DefectLog ที่ยังเปิดอยู่จากสคริปต์นี้แล้ว (id `2f21c80f-1ba3-4f0a-9815-dc59c971daf7`) จึงไม่สร้างซ้ำ

## 6. เกณฑ์และข้อจำกัด

- เกณฑ์ผ่าน: ไม่มีช่องโหว่ระดับ High หรือ Critical คงค้าง (TOR 4.8.1, ก.2.2.2) — ระดับ Moderate ลงไปบันทึกไว้ในแผนแก้ไขและแก้ในรอบบำรุงรักษา
- ขอบเขต: ช่องโหว่ที่ทราบของ dependency (Software Composition Analysis) จาก npm registry ณ เวลาที่สแกน — ไม่ครอบคลุมช่องโหว่ในโค้ดของระบบเอง, container image หรือโครงสร้างพื้นฐาน ซึ่งต้องตรวจเพิ่มด้วยการสแกน image/โครงสร้างพื้นฐานของสภาพแวดล้อม production และการทดสอบเจาะระบบตามเอกสาร `pentest-report`
- ผลเปลี่ยนได้เมื่อมี advisory ใหม่ จึงต้องสแกนซ้ำก่อนส่งมอบแต่ละงวดและก่อนใช้งานจริง

## 7. วิธีสแกนซ้ำ

```bash
npm run report:security          # สร้างรายงานนี้ใหม่
npm audit                        # ดูรายละเอียดบนเทอร์มินัล
npm audit --omit=dev             # เฉพาะ dependency ของ production
```
