---
permalink: /security/formal-verification/
read_when:
    - การตรวจสอบการรับประกันหรือข้อจำกัดของแบบจำลองความปลอดภัยอย่างเป็นทางการ
    - การทำซ้ำหรืออัปเดตการตรวจสอบแบบจำลองความปลอดภัยด้วย TLA+/TLC
summary: แบบจำลองความปลอดภัยที่ตรวจสอบด้วยเครื่องสำหรับเส้นทางที่มีความเสี่ยงสูงที่สุดของ OpenClaw
title: การพิสูจน์ความถูกต้องอย่างเป็นทางการ (แบบจำลองความปลอดภัย)
x-i18n:
    generated_at: "2026-04-24T09:33:07Z"
    model: gpt-5.4
    provider: openai
    source_hash: 8f50fa9118a80054b8d556cd4f1901b2d5fcb37fb0866bd5357a1b0a46c74116
    source_path: security/formal-verification.md
    workflow: 15
---

หน้านี้ติดตาม **แบบจำลองความปลอดภัยอย่างเป็นทางการ** ของ OpenClaw (ปัจจุบันคือ TLA+/TLC; และจะมีเพิ่มเติมตามความจำเป็น)

> หมายเหตุ: ลิงก์เก่าบางส่วนอาจยังอ้างถึงชื่อโปรเจ็กต์เดิม

**เป้าหมาย (ทิศทางหลัก):** จัดทำข้อโต้แย้งที่ตรวจสอบด้วยเครื่องว่า OpenClaw บังคับใช้นโยบายความปลอดภัยที่ตั้งใจไว้
(การให้สิทธิ์, การแยกเซสชัน, การควบคุมการใช้เครื่องมือ, และ
ความปลอดภัยเมื่อมีการตั้งค่าผิดพลาด) ภายใต้สมมติฐานที่ระบุไว้อย่างชัดเจน

**สิ่งที่นี่เป็นอยู่ (ในปัจจุบัน):** **ชุดทดสอบถดถอยด้านความปลอดภัย** แบบปฏิบัติการได้และขับเคลื่อนจากมุมมองผู้โจมตี:

- แต่ละข้ออ้างมีการตรวจสอบแบบจำลองที่รันได้บนปริภูมิสถานะแบบจำกัด
- หลายข้ออ้างมี **แบบจำลองเชิงลบ** ที่จับคู่กันเพื่อสร้างเส้นทางตัวอย่างโต้แย้งสำหรับคลาสบั๊กที่สมจริง

**สิ่งที่นี่ไม่ได้เป็น (ในตอนนี้):** ไม่ใช่ข้อพิสูจน์ว่า “OpenClaw ปลอดภัยในทุกด้าน” หรือว่าอิมพลีเมนเทชัน TypeScript ทั้งหมดถูกต้อง

## ที่อยู่ของแบบจำลอง

แบบจำลองได้รับการดูแลในรีโปแยกต่างหาก: [vignesh07/openclaw-formal-models](https://github.com/vignesh07/openclaw-formal-models)

## ข้อควรระวังสำคัญ

- สิ่งเหล่านี้คือ **แบบจำลอง** ไม่ใช่อิมพลีเมนเทชัน TypeScript ทั้งหมด จึงอาจเกิดความคลาดเคลื่อนระหว่างแบบจำลองกับโค้ดได้
- ผลลัพธ์ถูกจำกัดด้วยปริภูมิสถานะที่ TLC สำรวจ; สถานะ “ผ่าน” ไม่ได้หมายความว่าปลอดภัยนอกเหนือจากสมมติฐานและขอบเขตที่แบบจำลองครอบคลุม
- ข้ออ้างบางส่วนอาศัยสมมติฐานด้านสภาพแวดล้อมที่ระบุไว้อย่างชัดเจน (เช่น การปรับใช้ที่ถูกต้อง, อินพุตการตั้งค่าที่ถูกต้อง)

## การทำซ้ำผลลัพธ์

ปัจจุบันสามารถทำซ้ำผลลัพธ์ได้โดยโคลนรีโปแบบจำลองลงเครื่องและรัน TLC (ดูด้านล่าง) ในอนาคตอาจรองรับ:

- แบบจำลองที่รันใน CI พร้อมอาร์ติแฟกต์สาธารณะ (เส้นทางตัวอย่างโต้แย้ง, บันทึกการรัน)
- เวิร์กโฟลว์ “รันแบบจำลองนี้” แบบโฮสต์สำหรับการตรวจสอบขนาดเล็กที่มีขอบเขตจำกัด

เริ่มต้นใช้งาน:

```bash
git clone https://github.com/vignesh07/openclaw-formal-models
cd openclaw-formal-models

# Java 11+ required (TLC runs on the JVM).
# The repo vendors a pinned `tla2tools.jar` (TLA+ tools) and provides `bin/tlc` + Make targets.

make <target>
```

### การเปิดเผย Gateway และการตั้งค่า open gateway ผิดพลาด

**ข้ออ้าง:** การ bind ออกนอก loopback โดยไม่มีการยืนยันตัวตนอาจทำให้เกิดการยึดเครื่องจากระยะไกลได้ / เพิ่มการเปิดเผยพื้นผิวโจมตี; token/password ป้องกันผู้โจมตีที่ไม่ผ่านการยืนยันตัวตนได้ (ตามสมมติฐานของแบบจำลอง)

- การรันที่ผ่าน:
  - `make gateway-exposure-v2`
  - `make gateway-exposure-v2-protected`
- สีแดง (คาดไว้):
  - `make gateway-exposure-v2-negative`

ดูเพิ่มเติม: `docs/gateway-exposure-matrix.md` ในรีโปแบบจำลอง

### ไปป์ไลน์ exec ของ Node (ความสามารถที่มีความเสี่ยงสูงสุด)

**ข้ออ้าง:** `exec host=node` ต้องการ (ก) allowlist คำสั่งของ node ร่วมกับคำสั่งที่ประกาศไว้ และ (ข) การอนุมัติแบบสดเมื่อมีการตั้งค่าไว้; การอนุมัติถูกทำเป็นโทเค็นเพื่อป้องกันการเล่นซ้ำ (ในแบบจำลอง)

- การรันที่ผ่าน:
  - `make nodes-pipeline`
  - `make approvals-token`
- สีแดง (คาดไว้):
  - `make nodes-pipeline-negative`
  - `make approvals-token-negative`

### ที่เก็บ pairing (การควบคุม DM)

**ข้ออ้าง:** คำขอ pairing ปฏิบัติตาม TTL และข้อจำกัดจำนวนคำขอที่รอดำเนินการ

- การรันที่ผ่าน:
  - `make pairing`
  - `make pairing-cap`
- สีแดง (คาดไว้):
  - `make pairing-negative`
  - `make pairing-cap-negative`

### การควบคุม ingress (mentions + การข้ามด้วย control command)

**ข้ออ้าง:** ในบริบทกลุ่มที่กำหนดให้ต้อง mention, “control command” ที่ไม่ได้รับอนุญาตจะไม่สามารถข้ามการควบคุมการ mention ได้

- ผ่าน:
  - `make ingress-gating`
- สีแดง (คาดไว้):
  - `make ingress-gating-negative`

### การแยก routing/session-key

**ข้ออ้าง:** DM จากคู่สนทนาที่แตกต่างกันจะไม่ถูกรวมเป็นเซสชันเดียวกัน เว้นแต่จะมีการลิงก์/ตั้งค่าไว้อย่างชัดเจน

- ผ่าน:
  - `make routing-isolation`
- สีแดง (คาดไว้):
  - `make routing-isolation-negative`

## v1++: แบบจำลองแบบมีขอบเขตเพิ่มเติม (concurrency, retries, ความถูกต้องของ trace)

แบบจำลองต่อยอดเหล่านี้ช่วยเพิ่มความสมจริงให้ใกล้กับโหมดความล้มเหลวในโลกจริงมากขึ้น (การอัปเดตที่ไม่เป็นอะตอมิก, การลองใหม่, และการกระจายข้อความ)

### concurrency / idempotency ของที่เก็บ pairing

**ข้ออ้าง:** ที่เก็บ pairing ควรบังคับใช้ `MaxPending` และ idempotency แม้ภายใต้การสลับลำดับการทำงาน (กล่าวคือ “check-then-write” ต้องเป็นอะตอมิก / ถูกล็อก; การรีเฟรชไม่ควรสร้างรายการซ้ำ)

ความหมาย:

- ภายใต้คำขอพร้อมกัน จะต้องไม่เกิน `MaxPending` สำหรับช่องทางหนึ่ง ๆ
- คำขอ/การรีเฟรชซ้ำสำหรับ `(channel, sender)` เดิม ไม่ควรสร้างแถว pending ที่ยังใช้งานอยู่ซ้ำกัน

- การรันที่ผ่าน:
  - `make pairing-race` (การตรวจสอบเพดานแบบอะตอมิก/มีล็อก)
  - `make pairing-idempotency`
  - `make pairing-refresh`
  - `make pairing-refresh-race`
- สีแดง (คาดไว้):
  - `make pairing-race-negative` (race ของเพดานจาก begin/commit ที่ไม่เป็นอะตอมิก)
  - `make pairing-idempotency-negative`
  - `make pairing-refresh-negative`
  - `make pairing-refresh-race-negative`

### ความสัมพันธ์ของ trace / idempotency ของ ingress

**ข้ออ้าง:** การรับเข้าควรรักษาความสัมพันธ์ของ trace ตลอดการกระจาย และควรมี idempotency เมื่อผู้ให้บริการมีการลองใหม่

ความหมาย:

- เมื่อเหตุการณ์ภายนอกหนึ่งรายการกลายเป็นข้อความภายในหลายรายการ ทุกส่วนต้องคงเอกลักษณ์ของ trace/event เดิมไว้
- การลองใหม่ต้องไม่ทำให้เกิดการประมวลผลซ้ำ
- หากไม่มี event ID จากผู้ให้บริการ การ dedupe จะ fallback ไปใช้คีย์ที่ปลอดภัย (เช่น trace ID) เพื่อหลีกเลี่ยงการทิ้งเหตุการณ์ที่แตกต่างกัน

- ผ่าน:
  - `make ingress-trace`
  - `make ingress-trace2`
  - `make ingress-idempotency`
  - `make ingress-dedupe-fallback`
- สีแดง (คาดไว้):
  - `make ingress-trace-negative`
  - `make ingress-trace2-negative`
  - `make ingress-idempotency-negative`
  - `make ingress-dedupe-fallback-negative`

### ลำดับความสำคัญ dmScope ของ routing + identityLinks

**ข้ออ้าง:** routing ต้องแยกเซสชัน DM ออกจากกันโดยค่าเริ่มต้น และจะรวมเซสชันได้ก็ต่อเมื่อมีการตั้งค่าไว้อย่างชัดเจนเท่านั้น (ลำดับความสำคัญระดับช่องทาง + identity links)

ความหมาย:

- ค่าแทนที่ dmScope เฉพาะช่องทางต้องมีลำดับความสำคัญเหนือค่าปริยายระดับโกลบอล
- identityLinks ควรรวมเฉพาะภายในกลุ่มที่ลิงก์ไว้อย่างชัดเจนเท่านั้น ไม่ใช่ข้ามคู่สนทนาที่ไม่เกี่ยวข้องกัน

- ผ่าน:
  - `make routing-precedence`
  - `make routing-identitylinks`
- สีแดง (คาดไว้):
  - `make routing-precedence-negative`
  - `make routing-identitylinks-negative`

## ที่เกี่ยวข้อง

- [แบบจำลองภัยคุกคาม](/th/security/THREAT-MODEL-ATLAS)
- [การมีส่วนร่วมกับแบบจำลองภัยคุกคาม](/th/security/CONTRIBUTING-THREAT-MODEL)
