ต้องการคุยกับผู้ช่วยเหลือ
ไหมคะ 😊
  1. หน้าแรก
  2. ความปลอดภัยเว็บและแอป
  3. Laravel CVE-2026-114509
ระดับวิกฤต · CVSS 9.2 คู่มือเทคนิค อ่าน 7 นาที

ช่องโหว่ Laravel CVE-2026-114509: ล็อกอินเป็นผู้ใช้คนอื่นได้ วิธีเช็คและแก้ Laravel 8–13

ทีมวิศวกร Gramick House เผยแพร่ อัปเดตล่าสุด

CVE-2026-114509 คือช่องโหว่ระดับวิกฤต (CVSS v4 9.2) ใน TokenGuard ระบบยืนยันตัวตนด้วย API token ที่ติดมากับ Laravel เมื่อแอปใช้ guard แบบ token กับฐานข้อมูล MySQL หรือ MariaDB ผู้โจมตีล็อกอินเป็นผู้ใช้คนอื่นได้โดยไม่ต้องรู้ token รุ่นที่แก้แล้วคือ 12.68.0 และ 13.29.0 ส่วน Laravel 8, 9, 10 และ 11 ได้รับผลกระทบแต่ไม่มีแพตช์

ความรุนแรง
CVSS v4.0 9.2 (วิกฤต)
ต้องล็อกอินไหม
ไม่ต้อง
รุ่นที่ได้รับผลกระทบ
ทุกรุ่นก่อน 12.68.0 และ 13.0 – 13.28
รุ่นที่แก้แล้ว
12.68.0 · 13.29.0
อัปเดตล่าสุด
  • 27 ต.ค. ยังไม่พบรายงานการโจมตีจริง และ CISA ยังไม่ใส่ CVE นี้ในรายการ KEV
  • 23 ต.ค. GitHub Advisory Database เผยแพร่ CVE-2026-114509 ทำให้ composer audit เริ่มแจ้งเตือนโปรเจกต์ที่ยังใช้รุ่นเก่า
  • 19 ต.ค. ทีม Laravel ประกาศช่องโหว่ ตัวแก้ไขออกไปแล้วตั้งแต่ 25 ส.ค. 2569 ในรุ่น 12.68.0 และ 13.29.0 ถ้าอัปเดตสาย 12 หรือ 13 สม่ำเสมอหลังวันนั้น ถือว่าปลอดภัยแล้ว

01เกิดอะไรขึ้น

Laravel เป็น PHP framework ที่ใช้ทำเว็บ ระบบหลังบ้าน และ API ของแอปมือถือกันมากในไทย ช่องโหว่นี้อยู่ใน ตัว framework ส่วนที่ตรวจ API token ของผู้ใช้ แอปที่เปิด API ให้แอปมือถือหรือระบบภายนอกเรียกด้วย token จึงเสี่ยงที่สุด ถ้าไม่มีทีมคอยติดตามเรื่องนี้ ดูบริการดูแลความปลอดภัยเว็บไซต์และแอปรายเดือน

ปกติ TokenGuard รับ token จาก query string, body ของ request หรือ header แล้วค้นหาผู้ใช้ที่มี token ตรงกันในฐานข้อมูล ปัญหาคือโค้ดไม่ได้ตรวจว่าค่าที่รับมาเป็นข้อความ เมื่อผู้โจมตีส่งค่าที่ไม่ใช่ข้อความ ฐานข้อมูล MySQL และ MariaDB บางการตั้งค่าตีความแล้วจับคู่ไปเป็นผู้ใช้คนอื่น ผลคือ ล็อกอินเป็นผู้ใช้ที่มีอยู่ในระบบได้ รวมถึงผู้ดูแลระบบถ้าบัญชีนั้นใช้ guard เดียวกัน

ทีม Laravel แก้โดยเพิ่มการตรวจว่า token ต้องเป็นข้อความก่อนค้นหา ตัวแก้ไขออกไปในรุ่น 12.68.0 และ 13.29.0 เมื่อ 25 ส.ค. 2569 แล้วจึงประกาศเป็นช่องโหว่ภายหลังเมื่อ 19 ต.ค. 2569 ใครอัปเดตสาย 12 หรือ 13 เป็นประจำจึงได้รับการแก้ไขไปแล้ว ส่วนแอปที่ยังอยู่บน Laravel 11 หรือเก่ากว่าไม่ได้รับการแก้ไขเลย

ณ 27 ต.ค. 2569 เวลา 23:30 น. ยังไม่พบรายงานการโจมตีจริง แต่ประกาศและโค้ดที่แก้เปิดเผยบน GitHub แล้ว ควรแก้ภายในไม่กี่วัน ถ้าเซิร์ฟเวอร์เดียวกันยังใช้ PHP รุ่นเก่า ให้ดูคู่มือ PHP2Shell ด้วย เพราะเป็นช่องโหว่ระดับวิกฤตที่ CISA ยืนยันการโจมตีจริงแล้ว

02ใครได้รับผลกระทบ

แอปจะโดนเมื่อเข้าเงื่อนไข ครบทั้ง 3 ข้อ

เงื่อนไขเช็คจากตรงไหน
1. Laravel รุ่นก่อน 12.68.0 หรือ 13.0 – 13.28php artisan --version หรือ composer.lock
2. มี guard ที่ตั้ง 'driver' => 'token'config/auth.php ส่วน guards
3. ใช้ MySQL หรือ MariaDBDB_CONNECTION ในไฟล์ .env

ทำไมแอป Laravel รุ่นเก่ามักเข้าเงื่อนไขข้อ 2

โปรเจกต์ที่สร้างด้วย Laravel 5.8 ถึง 7 มี guard ชื่อ api ที่ใช้ driver token อยู่ใน config/auth.php ตั้งแต่ติดตั้ง Laravel 8 เป็นรุ่นแรกที่เอาออก แต่โปรเจกต์ที่อัปเกรดต่อมาจากรุ่นเก่ามักยังเก็บไว้ และ route ไหนที่ใช้ middleware auth:api ก็จะใช้ guard นี้ทันที

สิ่งที่ไม่อยู่ในขอบเขตของ CVE นี้

  • การล็อกอินหน้าเว็บด้วย session (guard web)
  • Laravel Sanctum และ Laravel Passport ซึ่งใช้ guard ของตัวเอง การแก้ไขในรุ่น 12.68.0 แก้เฉพาะไฟล์ TokenGuard ของ framework

ถึงอย่างนั้น หลายโปรเจกต์ใช้ Sanctum สำหรับแอปใหม่แต่ยังมี guard แบบ token ค้างอยู่ใน config ควรเช็คทุกโปรเจกต์ด้วยคำสั่งในหัวข้อ วิธีเช็ค

03รุ่นที่แก้แล้ว และระยะ security fix ของแต่ละรุ่น

สายรุ่นที่แก้แล้วSecurity fix ถึงPHP ที่รองรับคำแนะนำ
Laravel 1313.29.017 มี.ค. 25718.3 – 8.5อัปเดตเป็นรุ่นล่าสุดของสาย 13 ได้เลย
Laravel 1212.68.024 ก.พ. 25708.2 – 8.5อัปเดตได้เลย แต่ควรวางแผนขึ้น 13 ก่อน ก.พ. 2570
Laravel 11ไม่มีหมดแล้ว 12 มี.ค. 25698.2 – 8.4อุดชั่วคราว แล้วอัปเกรดเป็น 12 หรือ 13
Laravel 10ไม่มีหมดแล้ว 4 ก.พ. 25688.1 – 8.3อุดชั่วคราว แล้วอัปเกรด
Laravel 9ไม่มีหมดแล้ว 6 ก.พ. 25678.0 – 8.2อุดชั่วคราว แล้วอัปเกรด (ต้องเปลี่ยน PHP ด้วย)
Laravel 8 และเก่ากว่าไม่มีหมดแล้ว 24 ม.ค. 25667.3 – 8.1อุดชั่วคราว แล้วอัปเกรด PHP และ Laravel พร้อมกัน

ระยะ security fix และ PHP ที่รองรับมาจากตาราง Support Policy ทางการของ Laravel ส่วนรุ่นล่าสุด ณ วันที่เขียนคือ 13.39.0 และ 12.70.2 ซึ่งรวมการแก้ไขนี้แล้ว

04วิธีเช็คว่าแอปโดนหรือไม่

รันในโฟลเดอร์ของโปรเจกต์บนเซิร์ฟเวอร์ ทั้ง 4 คำสั่งอ่านอย่างเดียว ไม่เปลี่ยนแปลงระบบ

Terminal · 1. รุ่นของ Laravel
php artisan --version
Terminal · 2. มี guard แบบ token ไหม
grep -n "'driver'" config/auth.php

ถ้าเห็นบรรทัด 'driver' => 'token' แปลว่ามี guard แบบนี้อยู่ ให้เช็คต่อว่ามี route ใช้หรือไม่

Terminal · 3. route ไหนใช้ guard api
grep -rn "auth:api\|guard('api')" routes app
Terminal · 4. ฐานข้อมูลและช่องโหว่ที่ทราบแล้วของ library ทั้งหมด
grep -n "^DB_CONNECTION" .env
composer audit

composer audit จะแสดง CVE-2026-114509 ถ้ารุ่นที่ติดตั้งยังไม่แก้ รวมถึงช่องโหว่ของ library อื่นในโปรเจกต์ด้วย คำสั่งนี้มีใน Composer 2.4 ขึ้นไป

05วิธีแก้ Laravel 12 และ 13

อัปเดตบนเครื่องทดสอบก่อนเสมอ แล้วจึง deploy ขึ้นระบบจริง
Terminal
composer update laravel/framework --with-all-dependencies
php artisan --version
php artisan optimize:clear

รุ่นที่ได้ต้องเป็น 12.68.0 หรือ 13.29.0 ขึ้นไป จากนั้นรีสตาร์ต PHP-FPM และ process ที่รันค้าง เพื่อให้โหลดโค้ดใหม่

Terminal · เลือกตามที่โปรเจกต์ใช้
sudo systemctl restart php8.3-fpm
php artisan queue:restart
# ถ้าใช้ Octane
php artisan octane:reload

ถ้า deploy ด้วย Docker ให้ build image ใหม่จาก composer.lock ที่อัปเดตแล้ว การรีสตาร์ต container อย่างเดียวไม่ได้เปลี่ยนโค้ด

06Laravel 8–11 ที่ไม่มีแพตช์

รุ่นเหล่านี้พ้นระยะ security fix แล้ว จะไม่มีรุ่นแก้ไขออกมา ทางเลือกเรียงจากเร็วที่สุดไปถึงถาวร

ทางที่ 1: ไม่ได้ใช้ guard แบบ token ให้เอาออก

ถ้าคำสั่งเช็คข้อ 3 ไม่พบ route ใดใช้ auth:api ให้ลบ guard ที่ใช้ driver token ออกจาก config/auth.php แล้วรัน php artisan config:clear ถ้ามีโค้ดเรียก guard นี้อยู่ จะเห็น error ทันทีระหว่างทดสอบ

ทางที่ 2: ใช้อยู่ ให้อุดด้วย middleware ชั่วคราว

middleware นี้ทำแบบเดียวกับที่ทีม Laravel แก้ คือปฏิเสธ request ที่ส่ง api_token มาเป็นค่าที่ไม่ใช่ข้อความ ก่อนจะถึง TokenGuard

app/Http/Middleware/RejectNonStringApiToken.php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

// Temporary fix for CVE-2026-114509 on Laravel versions without a patch.
// Change 'api_token' if config/auth.php sets a different 'input_key'.
class RejectNonStringApiToken
{
    public function handle(Request $request, Closure $next)
    {
        $token = $request->input('api_token');

        if ($token !== null && ! is_string($token)) {
            abort(401);
        }

        return $next($request);
    }
}

ลงทะเบียนเป็น global middleware ให้ทำงานก่อนการยืนยันตัวตนทุก route

Laravel 8, 9, 10 · app/Http/Kernel.php
protected $middleware = [
    \App\Http\Middleware\RejectNonStringApiToken::class,
    // ... middleware เดิม
];
Laravel 11 · bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->prepend(\App\Http\Middleware\RejectNonStringApiToken::class);
})

ถ้าโค้ดเรียก Auth::guard('api')->validate() ด้วยค่าที่ไม่ได้มาจาก api_token ของ request ให้ตรวจ is_string() ก่อนส่งเข้าไปด้วย

ทางที่ 3: อัปเกรดเป็น Laravel 12 หรือ 13 (ทางแก้ถาวร)

Laravel 12 ต้องใช้ PHP 8.2 ขึ้นไป และ Laravel 13 ต้องใช้ PHP 8.3 ขึ้นไป แอปบน Laravel 8 หรือ 9 ส่วนใหญ่ยังรันบน PHP 7.4 ถึง 8.1 ซึ่งไม่มีรุ่นแก้ไข PHP2Shell จากทีม PHP การอัปเกรดจึงมักต้องทำทั้ง PHP และ Laravel พร้อมกัน ไล่ทีละรุ่นหลัก และทดสอบทุกหน้าจอที่สำคัญ

07ช่องโหว่อื่นของ Laravel ในรอบเดียวกัน

CVEระดับรายละเอียดรุ่นที่แก้แล้ว
CVE-2026-114509CriticalTokenGuard ถูกข้ามการยืนยันตัวตนด้วยค่า token ที่ไม่ใช่ข้อความ (คู่มือนี้)12.68.0 · 13.29.0
CVE-2026-114508Mediumการดึงข้อมูลความสัมพันธ์ (relationship inclusion) อาจทำให้ข้อมูลถูกลบโดยไม่ได้รับอนุญาต กระทบ 12.45.0 ขึ้นไปและสาย 1312.68.0 · 13.27.0
CVE-2026-102279LowXSS ในหน้าแสดงข้อมูล debug ประกาศ 29 ก.ย. 2569 ถ้า production ตั้ง APP_DEBUG=false ไว้แล้วจะไม่เห็นหน้านี้12.69.0 · 13.30.0

อัปเดตเป็นรุ่นล่าสุดของสาย 12 หรือ 13 ครั้งเดียวได้การแก้ไขครบทั้ง 3 รายการ

08คำถามที่พบบ่อย

CVE-2026-114509 คือช่องโหว่ระดับวิกฤต (CVSS v4 9.2) ใน TokenGuard ซึ่งเป็นระบบยืนยันตัวตนด้วย API token ที่ติดมากับ Laravel framework เมื่อแอปใช้ guard แบบ token กับฐานข้อมูล MySQL หรือ MariaDB ผู้โจมตีสามารถส่งค่า token ที่ไม่ใช่ข้อความ (non-string) แล้วระบบจับคู่ไปเป็นผู้ใช้คนอื่น ทำให้ล็อกอินเป็นผู้ใช้ใดก็ได้โดยไม่ต้องรู้ token ประกาศเมื่อ 19 ตุลาคม 2569 รุ่นที่แก้แล้วคือ laravel/framework 12.68.0 และ 13.29.0 ส่วน Laravel 8, 9, 10 และ 11 ได้รับผลกระทบแต่ไม่มีแพตช์ เพราะพ้นระยะ security fix แล้ว

โดนเมื่อเข้าเงื่อนไขครบ 3 ข้อ คือ ใช้ Laravel รุ่นก่อน 12.68.0 หรือ 13.0 ถึง 13.28 มี guard ที่ตั้ง driver เป็น token ใน config/auth.php และใช้ฐานข้อมูล MySQL หรือ MariaDB guard แบบนี้เป็นค่าเริ่มต้นชื่อ api ในโปรเจกต์ Laravel 5.8 ถึง 7 โปรเจกต์ที่สร้างตั้งแต่สมัยนั้นแล้วอัปเกรดต่อมามักยังมี guard นี้อยู่ ถึงไม่ได้ใช้ guard นี้ ก็ควรอัปเดตหรืออุดไว้ เพราะ route ใดที่ใช้ middleware auth:api จะเปิดช่องทันที

ประกาศระบุเฉพาะ TokenGuard ของ framework และการแก้ไขในรุ่น 12.68.0 ก็แก้เฉพาะไฟล์ TokenGuard ส่วน Sanctum และ Passport ใช้ guard ของตัวเอง จึงไม่อยู่ในขอบเขตของ CVE นี้ แต่แอปจำนวนมากมีทั้ง Sanctum และ guard แบบ token ค้างอยู่ใน config/auth.php ให้เช็คด้วยคำสั่งในคู่มือนี้ และควรอัปเดต framework อยู่ดี

ประกาศระบุว่าการโจมตีเกิดภายใต้การตั้งค่าฐานข้อมูลบางแบบของ MySQL และ MariaDB ไม่ได้ระบุว่า PostgreSQL หรือ SQLite ได้รับผลกระทบ แต่ช่วงรุ่นที่ได้รับผลกระทบในประกาศไม่ได้แยกตามฐานข้อมูล จึงควรอัปเดตหรืออุดไว้เหมือนกัน

ไม่มี Laravel 11 พ้นระยะ security fix เมื่อ 12 มีนาคม 2569 และรุ่นก่อนหน้าพ้นไปก่อนนั้น ประกาศจึงระบุรุ่นที่แก้แล้วไว้เพียง 12.68.0 และ 13.29.0 ระหว่างวางแผนอัปเกรด ให้ใช้ middleware อุดชั่วคราวในคู่มือนี้ หรือลบ guard แบบ token ออกถ้าไม่ได้ใช้ ทางแก้ถาวรคืออัปเกรดเป็น Laravel 12 หรือ 13

ณ 27 ตุลาคม 2569 ยังไม่พบรายงานการโจมตีจริง และ CISA ยังไม่ได้ใส่ CVE นี้ในรายการ Known Exploited Vulnerabilities แต่โค้ดที่แก้และชุดทดสอบเปิดเผยบน GitHub แล้ว ผู้โจมตีจึงศึกษาวิธีโจมตีได้ ควรแก้ภายในไม่กี่วัน

เช็ครุ่นอีกครั้งด้วย php artisan --version ล้าง cache ของ config และ route แล้วรีสตาร์ต PHP-FPM, queue worker และ Octane ถ้าใช้ จากนั้นค้น access log ย้อนหลังหา request ไปยัง API ที่ส่ง api_token มาเป็น array หรือตัวเลข ถ้าพบ ให้ถือว่าบัญชีที่ถูกใช้อาจถูกเข้าถึง เปลี่ยน api_token ของผู้ใช้ทุกคน และตรวจข้อมูลที่ถูกแก้ไขในช่วงนั้น

ให้ทีมที่ดูแลเซิร์ฟเวอร์รันคำสั่ง php artisan --version ในโฟลเดอร์ของเว็บ หรือดูไฟล์ composer.lock ถ้าไม่มีใครดูแล ทีม Gramick House ตรวจให้ได้ภายใน 1 วันทำการ บอกว่าโดนหรือไม่ และเสนอวิธีแก้พร้อมราคาก่อนเริ่มงาน

09แหล่งอ้างอิง

  1. GitHub Advisory GHSA-f9x3-7vq9-cph6 (CVE-2026-114509): Laravel TokenGuard authentication bypass through non-string API credentials
  2. laravel/framework: การแก้ไขใน TokenGuard ระหว่าง v12.67.0 และ v12.68.0
  3. GitHub Advisory GHSA-5wcm-3v2w-8362 (CVE-2026-114508): Laravel relationship inclusion can trigger unauthorized data destruction
  4. GitHub Advisory GHSA-jh5r-qr3c-85q8 (CVE-2026-102279): Laravel XSS in Debug Page Information
  5. Laravel: Release Notes และ Support Policy (ช่วงเวลา security fix ของแต่ละรุ่น)
  6. Laravel 10.x Release Notes: Support Policy ของ Laravel 8–11
  7. laravel/laravel 7.x: config/auth.php (guard api แบบ token เป็นค่าเริ่มต้น)
  8. Packagist: laravel/framework (รุ่นและวันออก)
  9. CISA: Known Exploited Vulnerabilities Catalog
ประกาศเตือนอื่น: PHP2Shell (CVE-2026-109618 / CVE-2026-109619) ช่องโหว่ระดับวิกฤตในตัว PHP ที่ CISA ยืนยันการโจมตีจริงแล้ว — วิธีตรวจและแก้ → ประกาศเตือนอื่น: ช่องโหว่ Node.js ต.ค. 2026 และ Next.js RCE — วิธีเช็คและอัปเดต →

ข้อมูลในคู่มือนี้รวบรวมจากประกาศของ Laravel, GitHub Advisory Database และตาราง Support Policy ทางการ ณ 27 ต.ค. 2569 เวลา 23:30 น. สถานการณ์อาจเปลี่ยนแปลง โปรดตรวจประกาศล่าสุดก่อนดำเนินการ คู่มือนี้ไม่มีรายละเอียดวิธีโจมตี