Gateway
การดำเนินการกับไฟล์อย่างปลอดภัย
OpenClaw ใช้ @openclaw/fs-safe สำหรับการดำเนินการกับไฟล์ภายในเครื่องที่ไวต่อความปลอดภัย: การอ่าน/เขียนที่จำกัดอยู่ภายในราก, การแทนที่แบบอะตอมมิก, การแตกไฟล์เก็บถาวร, พื้นที่ทำงานชั่วคราว, สถานะ JSON และการจัดการไฟล์ลับ
เป้าหมายคือ แนวป้องกันระดับไลบรารี ที่สม่ำเสมอสำหรับโค้ด OpenClaw ที่เชื่อถือได้ซึ่งรับชื่อพาธที่ไม่น่าเชื่อถือเข้ามา นี่ไม่ใช่แซนด์บ็อกซ์ สิทธิ์ของระบบไฟล์โฮสต์, ผู้ใช้ OS, คอนเทนเนอร์ และนโยบาย agent/tool ยังคงเป็นตัวกำหนดขอบเขตผลกระทบจริง
ค่าเริ่มต้น: ไม่มีตัวช่วย Python
OpenClaw ตั้งค่าเริ่มต้นให้ตัวช่วย POSIX Python ของ fs-safe เป็น ปิด
เหตุผล:
- Gateway ไม่ควรสร้าง Python sidecar แบบถาวร เว้นแต่ผู้ปฏิบัติงานจะเลือกใช้เอง;
- การติดตั้งจำนวนมากไม่ต้องการการเสริมความแข็งแรงเพิ่มเติมสำหรับการกลายพันธุ์ของไดเรกทอรีแม่;
- การปิดใช้ Python ทำให้พฤติกรรมของแพ็กเกจ/รันไทม์คาดเดาได้มากขึ้นในสภาพแวดล้อมเดสก์ท็อป, Docker, CI และแอปที่บันเดิลมา
OpenClaw เปลี่ยนเฉพาะค่าเริ่มต้นเท่านั้น หากคุณตั้งโหมดไว้อย่างชัดเจน fs-safe จะเคารพค่านั้น:
# Default OpenClaw behavior: Node-only fs-safe fallbacks.
OPENCLAW_FS_SAFE_PYTHON_MODE=off
# Opt into the helper when available, falling back if unavailable.
OPENCLAW_FS_SAFE_PYTHON_MODE=auto
# Fail closed if the helper cannot start.
OPENCLAW_FS_SAFE_PYTHON_MODE=require
# Optional explicit interpreter.
OPENCLAW_FS_SAFE_PYTHON=/usr/bin/python3
ชื่อ fs-safe ทั่วไปก็ใช้งานได้เช่นกัน: FS_SAFE_PYTHON_MODE และ FS_SAFE_PYTHON
สิ่งที่ยังได้รับการป้องกันเมื่อไม่มี Python
เมื่อตัวช่วยปิดอยู่ OpenClaw ยังคงใช้พาธ Node ของ fs-safe สำหรับ:
- ปฏิเสธการหลุดออกจากพาธสัมพัทธ์ เช่น
.., พาธสัมบูรณ์ และตัวคั่นพาธในจุดที่อนุญาตเฉพาะชื่อ; - แก้ไขการดำเนินการผ่านแฮนเดิลรากที่เชื่อถือได้ แทนการตรวจสอบแบบเฉพาะกิจด้วย
path.resolve(...).startsWith(...); - ปฏิเสธรูปแบบ symlink และ hardlink บน API ที่กำหนดนโยบายนี้;
- เปิดไฟล์พร้อมการตรวจสอบอัตลักษณ์ในจุดที่ API ส่งคืนหรือรับเนื้อหาไฟล์;
- เขียนแบบอะตอมมิกผ่านไฟล์ชั่วคราวข้างเคียงสำหรับไฟล์สถานะ/คอนฟิก;
- จำกัดจำนวนไบต์สำหรับการอ่านและการแตกไฟล์เก็บถาวร;
- ใช้โหมดส่วนตัวสำหรับไฟล์ลับและไฟล์สถานะในจุดที่ API กำหนด
การป้องกันเหล่านี้ครอบคลุมโมเดลภัยคุกคามปกติของ OpenClaw: โค้ด Gateway ที่เชื่อถือได้จัดการอินพุตพาธจากโมเดล/Plugin/ช่องทางที่ไม่น่าเชื่อถือ ภายในขอบเขตผู้ปฏิบัติงานเดียวที่เชื่อถือได้
สิ่งที่ Python เพิ่มเข้ามา
บน POSIX ตัวช่วยเสริมของ fs-safe จะคงกระบวนการ Python แบบถาวรไว้หนึ่งกระบวนการ และใช้การดำเนินการกับระบบไฟล์แบบอ้างอิงสัมพันธ์กับ fd สำหรับการกลายพันธุ์ของไดเรกทอรีแม่ เช่น rename, remove, mkdir, stat/list และพาธการเขียนบางส่วน
สิ่งนี้ลดช่วงเวลา race แบบ same-UID ที่กระบวนการอื่นสามารถสลับไดเรกทอรีแม่ระหว่างการตรวจสอบและการกลายพันธุ์ได้ เป็นการป้องกันเชิงลึกสำหรับโฮสต์ที่กระบวนการภายในเครื่องที่ไม่น่าเชื่อถือสามารถแก้ไขไดเรกทอรีเดียวกับที่ OpenClaw กำลังดำเนินการอยู่
หากการปรับใช้ของคุณมีความเสี่ยงนี้และรับประกันว่ามี Python อยู่ ให้ใช้:
OPENCLAW_FS_SAFE_PYTHON_MODE=require
ใช้ require แทน auto เมื่อตัวช่วยเป็นส่วนหนึ่งของจุดยืนด้านความปลอดภัยของคุณ; auto จะถอยกลับไปใช้พฤติกรรมเฉพาะ Node โดยเจตนาหากตัวช่วยไม่พร้อมใช้งาน
คำแนะนำสำหรับ Plugin และแกนหลัก
- การเข้าถึงไฟล์ที่หันหน้าให้ Plugin ควรผ่านตัวช่วย
openclaw/plugin-sdk/*ไม่ใช่fsโดยตรง เมื่อพาธมาจากข้อความ, เอาต์พุตของโมเดล, คอนฟิก หรืออินพุตของ Plugin - โค้ดแกนหลักควรใช้ wrapper fs-safe ภายในเครื่องภายใต้
src/infra/*เพื่อให้นโยบายกระบวนการของ OpenClaw ถูกนำไปใช้อย่างสม่ำเสมอ - การแตกไฟล์เก็บถาวรควรใช้ตัวช่วยไฟล์เก็บถาวรของ fs-safe พร้อมขีดจำกัดด้านขนาด, จำนวนรายการ, ลิงก์ และปลายทางที่ระบุอย่างชัดเจน
- ความลับควรใช้ตัวช่วยความลับของ OpenClaw หรือตัวช่วยความลับ/สถานะส่วนตัวของ fs-safe; อย่าเขียนการตรวจสอบโหมดรอบ
fs.writeFileเอง - หากคุณต้องการการแยกผู้ใช้ภายในเครื่องที่เป็นศัตรู อย่าพึ่งพา fs-safe เพียงอย่างเดียว ให้รัน Gateway แยกกันภายใต้ผู้ใช้/โฮสต์ OS แยกกัน หรือใช้แซนด์บ็อกซ์
ที่เกี่ยวข้อง: ความปลอดภัย, แซนด์บ็อกซ์, การอนุมัติ Exec, ความลับ.