Privilege Escalation คืออะไร และวิธีตรวจสอบช่องโหว่ใน Local Storage ของ Vibe Coding Project

Privilege Escalation คืออะไร

Privilege Escalation คือช่องโหว่ด้านความปลอดภัยที่ผู้ใช้ทั่วไปสามารถ เพิ่มสิทธิ์ของตัวเองให้สูงกว่าที่ควรได้รับ ในกรณีของ Vibe Coding มักเกิดจากการที่ AI เขียนโค้ดเก็บ Role ของผู้ใช้ (เช่น user หรือ admin) ไว้ใน Local Storage (หรือบางทีก็เป็น Cookie) ซึ่งเป็นพื้นที่จัดเก็บข้อมูลฝั่ง Browser ที่ผู้ใช้แก้ไขได้เองโดยตรง

ช่องโหว่นี้เชื่อมโยงกับ OWASP Top 10 (A01:2025) ในหมวด Broken Access Control และเป็นหนึ่งในข้อผิดพลาดที่พบบ่อยที่สุดในโปรเจกต์ที่สร้างด้วย Vibe Coding

⚠️ ความเสี่ยง: Local Storage ออกแบบมาสำหรับเก็บการตั้งค่าที่ไม่ใช่ข้อมูลสำคัญเท่านั้น เช่น ภาษา หรือธีมสีของหน้าเว็บ ถ้าเก็บ Role ของผู้ใช้ไว้ที่นี่ ใครก็ตามสามารถเปิด DevTools แล้วเปลี่ยนตัวเองจาก user เป็น admin ได้ใน 10 วินาที

ตัวอย่างกรณีศึกษา: PixelForge AI Platform

ตัวอย่างกรณีศึกษา: PixelForge AI Platform ที่มีช่องโหว่เรื่อง Privilege Escalation ใน Local Storage

สถานการณ์: PixelForge AI คือ Platform สำหรับ Generate ภาพด้วย AI สร้างด้วย Vibe Coding มีระบบสมัครสมาชิกและระบบอนุมัติบัญชี โดยแบ่งผู้ใช้เป็น 2 Role

Admin — เห็นรายชื่อผู้ใช้ทั้งหมดพร้อมปุ่ม Approve / Reject

User — เห็นหน้าโปรไฟล์และข้อความรอการอนุมัติจาก Admin

สิ่งที่เว็บแสดง: ผู้ใช้ที่ Login แล้วจะเห็นเฉพาะหน้าของตัวเอง ดูเหมือนระบบทำงานถูกต้อง

สิ่งที่เกิดขึ้นจริงในระบบ: ระบบบันทึกการตั้งค่าสิทธิการใช้งาน (Role) ไว้ใน Local Stoage / Cookie ซึ่งถ้าหากผู้ใช้งานมีความรู้ก็รู้ว่าจะสามารถเปลี่ยน Role ได้จากที่นี่โดยตรง

ดูตัวอย่างเว็บไซต์จริงที่: vibe-coding-security.vercel.app/privilege-escalation

วิธีตรวจสอบด้วย Application Tab ใน Chrome DevTools

ใช้เวลาไม่เกิน 5 นาที สามารถตรวจสอบได้เองง่าย ๆ ดังนี้

ขั้นตอนที่ 1: เปิด DevTools

เปิดเว็บไซต์ใน Chrome แล้ว คลิกขวา → Inspect หรือกด F12 เพื่อเปิด DevTools

ขั้นตอนที่ 2: เปิด Application Tab

ในแถบเมนูด้านบนของ DevTools ให้คลิกที่แถบ Application จากนั้นที่แถบด้านซ้าย ให้เลือก Local Storage แล้วคลิกที่ชื่อโดเมนของเว็บไซต์คุณ

ขั้นตอนที่ 3: ตรวจสอบค่าใน Local Storage

มองหาค่าที่เกี่ยวข้องกับสิทธิ์หรือ Role ของผู้ใช้ เช่น

  • userRole, accessLevel, permission
  • role: user, admin, moderator
  • isAdmin: true / false
  • authToken ที่มี Role ฝังอยู่ใน Plain Text

ขั้นตอนที่ 4: ทดลองแก้ไขค่า

ถ้าพบค่า Role ใน Local Storage ให้ทดลอง ดับเบิลคลิกที่ค่านั้น แล้วแก้ไขเป็น admin จากนั้น Reload หน้าเว็บ

ถ้าหน้าเว็บเปลี่ยนไปแสดงเนื้อหาหรือฟีเจอร์ที่ไม่ควรเห็น แปลว่าช่องโหว่นี้มีอยู่จริงในเว็บไซต์ของคุณ

สิ่งที่ต้องระวัง:

  • Token ใด ๆ ที่มีข้อมูล Role อยู่ในรูป Plain Text
  • ค่า role หรือ userRole ที่อ่านได้ตรง ๆ โดยไม่มีการเข้ารหัส
  • ค่า isAdmin: true/false ที่เก็บใน Local Storage

สาเหตุที่เกิด Privilege Escalation ใน Vibe Coding Project

AI เก็บ Role ผู้ใช้ไว้ใน Local Storage

เมื่อสั่ง AI ให้สร้างระบบ Login พร้อมแบ่งสิทธิ์ผู้ใช้ AI มักเลือกวิธีที่ง่ายและเร็วที่สุด นั่นคือเก็บ Role ไว้ใน Local Storage เพราะเป็นวิธีที่อ่านและเขียนได้ง่ายมากจากฝั่ง JavaScript โดยที่ไม่ต้องมีระบบ Backend ที่ซับซ้อน

ปัญหาคือ Local Storage เป็นพื้นที่สาธารณะที่ผู้ใช้ทุกคนสามารถเข้าไปแก้ไขได้เองผ่าน DevTools โดยไม่ต้องมีความรู้ด้าน Hacking

ตรวจสอบสิทธิ์ที่ฝั่ง Client แทน Server

เมื่อ Role ถูกเก็บใน Local Storage การตรวจสอบสิทธิ์ก็เกิดขึ้นในเบราว์เซอร์ของผู้ใช้เอง ซึ่งหมายความว่าผู้ใช้สามารถ “หลอก” ระบบได้ง่าย ๆ โดยไม่ต้องผ่าน Server เลย

ใน Vibe Coding Project มักโฟกัสที่ว่าหน้าเว็บ “แสดงผลได้ถูกต้อง” โดยไม่ได้ตรวจสอบว่าค่าที่ใช้ตัดสินใจแสดงผลนั้นสามารถถูกแก้ไขได้จากภายนอกหรือไม่

วิธีแก้ไข

เมื่อพบว่าระบบเก็บ Role ไว้ใน Local Storage ให้ใช้ Prompt นี้กับ AI เพื่อแก้ไข:

ตรวจสอบระบบ Authentication ในโปรเจกต์นี้และแก้ไขให้ถูกต้องโดย:
1. ย้ายการเก็บ Role และการตรวจสอบสิทธิ์ไปไว้ที่ Backend/Server แทน Local Storage
2. ใช้ Server-side Session หรือ JWT Token ที่มีการเซ็น (Signed) อย่างถูกต้อง
3. ทุก API endpoint ที่ต้องการสิทธิ์ Admin ต้องตรวจสอบ Token ที่ Server ทุกครั้ง
4. Local Storage ใช้ได้เฉพาะการตั้งค่า UI เช่น ภาษา หรือธีมเท่านั้น ห้ามเก็บข้อมูลที่เกี่ยวกับสิทธิ์
อ้างอิงหลักการ Server-side Authorization และ OWASP Top 10 (A01:2025 Broken Access Control)

คำถามที่พบบ่อย (FAQ)

Privilege Escalation คืออะไร?

คือช่องโหว่ที่ผู้ใช้ทั่วไปสามารถเพิ่มสิทธิ์ของตัวเองให้สูงขึ้นโดยไม่ได้รับอนุญาต ในกรณีนี้คือการแก้ไขค่า Role ใน Local Storage เพื่อเข้าถึงฟีเจอร์ของ Admin

Local Storage ใช้เก็บอะไรได้บ้าง?

Local Storage เหมาะสำหรับเก็บการตั้งค่า UI ที่ไม่กระทบต่อความปลอดภัย เช่น ภาษา (lang: "th"), ธีมสี (theme: "dark"), หรือการตั้งค่า Display ส่วนตัว ห้ามใช้เก็บ Role, Token ที่มีสิทธิ์, หรือข้อมูลที่ใช้ตัดสินใจเรื่องการเข้าถึง

ถ้าหน้าเว็บซ่อนปุ่ม Admin ไว้แล้ว ทำไมยังไม่ปลอดภัย?

การซ่อนปุ่มหรือเมนูบนหน้าเว็บไม่ได้ป้องกันช่องโหว่นี้ เพราะปัญหาอยู่ที่ Logic การตรวจสอบสิทธิ์ ไม่ใช่การแสดงผล ตราบใดที่ Role ถูกอ่านจาก Local Storage และตรวจสอบในฝั่ง Client ผู้ใช้ก็ยังสามารถแก้ไขค่าแล้ว Reload เพื่อเข้าถึงหน้า Admin ได้

ช่องโหว่นี้ส่งผลกระทบอะไรบ้าง?

ส่งผลให้ผู้ใช้ทั่วไปสามารถเข้าถึงข้อมูลของผู้ใช้คนอื่น, อนุมัติหรือลบบัญชีผู้ใช้, และเข้าถึงฟีเจอร์ที่สงวนไว้สำหรับ Admin ซึ่งอาจนำไปสู่การรั่วไหลของข้อมูลและอาจผิดกฎหมายคุ้มครองข้อมูลส่วนบุคคล (PDPA)

อ้างอิง: OWASP Top 10 — A01:2025 Broken Access Control