LLM дэд бүтцийн санах ойн цоорхой: Cloudflare-ийн KV Cache алдаагаар өөр хэрэглэгчийн дата задарчээ
Сүүлийн жилүүдэд хиймэл оюуны салбарт контекстийн цонхыг 1 сая, түүнээс ч олон токенд хүргэх өрсөлдөөн ид өрнөж байна. Гэвч ийм аварга том өгөгдлийг олон хэрэглэгч зэрэг ашигладаг (multi-tenant) кластер дээр ажиллуулах нь системийн түвшинд ямар эрсдэл дагуулдгийг харуулсан нэгэн ноцтой сургамж саяхан тохиолоо.
Cloudflare компани өөрийн Workers AI платформ дээр илэрсэн "Cross-request KV cache exposure" буюу хэрэглэгчдийн асуулга хоорондын санах ой алдагдсан явдлын нарийвчилсан тайланг албан ёсоор нийтэллээ. Уг алдааны улмаас хэрэглэгчийн асуусан асуултад өөр нэгэн хэрэглэгчийн өмнөх prompt болон нууц өгөгдөл шууд холилдон хариу болж очиж байсан нь тогтоогдсон байна.
Энэ явдал нь сүлжээний болон C/C++ хэлний эрин үеийн алдарт Heartbleed цоорхой өнөөдөр GPU болон LLM дэд бүтцэд шинэ хэлбэрээр эргэн ирж буйг харуулсан тод жишээ боллоо.
155 хариулт ба 681,280 токений босго
Knostic компанийн аюулгүй байдлын шинжээч Гади Эврон (Gadi Evron) Cloudflare-ийн HackerOne хөтөлбөрөөр дамжуулан уг цоорхойг анх мэдээлжээ. Түүний мэдээлснээр Workers AI дээрх GLM-5.3 модел руу маш урт prompt илгээхэд хариунд нь бусад танихгүй хэрэглэгчдийн session-ий өгөгдөл ил гарч байсан байна.
Cloudflare-ийн инженерийн баг мэдээллийн дагуу шалгаж, ердөө 25 минутын дотор алдааг баталгаажуулан, уг моделыг яаралтай сүлжээнээс тусгаарлажээ. Шалгалтаар уг цоорхой нийт 13 хоногийн турш идэвхтэй байсан бөгөөд 681,280-аас дээш токен бүхий урт асуулга илгээсэн 155 хариултад бусад хэрэглэгчийн дата холилдсон болох нь тогтоогджээ. Азаар энэ нь гадны халдлагаас бус, урт контекст туршиж байсан хэрэглэгчдийн ердийн асуулгаар санамсаргүй сэдрэгдсэн байна.
Гэвч энэ алдаа яг яаж болов? Үүнийг ойлгохын тулд орчин үеийн LLM-ийн ажиллах зарчмыг санах хэрэгтэй.
KV Cache ба Disaggregated Serving: Дэд бүтцэд юу нуугдаж байв?
Transformer загвар текст боловсруулахдаа үг бүрт Attention матриц тооцоолдог. Хэрэглэгчийн өгсөн эхний текстийг нэг дор тооцоолохыг Prefill, харин түүн дээрээ үндэслэн хариуг үг үгээр нь цувуулан үүсгэхийг Decode шат гэнэ.
Decode шатанд өмнөх үгсийг дахин дахин тооцоолохгүйн тулд тэдгээрийн векторуудыг GPU-ийн VRAM санах ойд түр хадгалдаг бөгөөд үүнийг KV Cache (Key-Value Cache) гэж нэрлэдэг. Сая сая хэрэглэгчийн хүсэлтийг хурдан шийдвэрлэхийн тулд Cloudflare болон орчин үеийн AI компаниуд Disaggregated Serving архитектур ашигладаг:
- Prefill GPU-ууд: Зөвхөн хэрэглэгчийн орж ирсэн аварга урт prompt-ийг тооцоолж, KV Cache-ийг үүсгэнэ.
- RDMA дамжуулалт: Үүссэн бэлэн санах ойг өндөр хурдны сүлжээгээр (Mooncake протокол ашиглан) Decode GPU-рүү шилжүүлнэ.
- Decode GPU-ууд: Бэлэн болсон санах ойг уншиж, хариу текстийг үүсгэж эхэлнэ.
Гүйцэтгэлийг унагахгүйн тулд GPU VRAM дээр KV Cache-ийг асуулга бүрд шинээр үүсгэж устгахгүйгээр, тогтмол хэмжээтэй хуудаснууд (fixed-size memory pages) бүхий санах ойн санг (memory pool) урьдчилан бэлдэж хуваан ашигладаг. Хамгийн чухал нь: хүсэлт дууссаны дараа VRAM-ийг тэг (zero-out) болгож цэвэрлэх нь асар их latency үүсгэдэг тул хуучин өгөгдлийг нь арчилгүй тэр чигээр нь орхидог. Дэд бүтэц зөвхөн аль хуудас хэнийх вэ гэдгийг хатуу бүртгэх үүрэгтэй байдаг.
Тохиргооны алдаа + Хөдөлгүүрийн дутуу logic = Мэдээлэл алдагдах зам
Хамгийн том осол хоёр тусдаа жижиг алдаа нийлэх үед тохиолддог. Энэ удаад яг тийм зүйл болжээ:
- Тохиргооны зөрүү: Cloudflare уг моделыг хэрэглэгчдэд 1,048,576 токен (1 сая) хүртэл ажиллана гэж зарласан боловч Prefill серверийн GPU VRAM дээрх KV Cache санг ердөө 681,280 токенд тааруулан хязгаарласан байв. Инженерүүд хэрэв хэрэглэгч 681,280-аас урт prompt илгээвэл систем шууд "Error" буцаана гэж таамаглажээ.
- SGLang хөдөлгүүрийн алдаа: Cloudflare-ийн ашиглаж байсан нээлттэй эхийн SGLang инференс хөдөлгүүрт алдаа байв. Хэрэглэгч 681,280-аас хэтэрсэн токен илгээхэд SGLang асуулгыг бүрэн цуцлах (abort) ёстой байтал уг хүсэлтийг "татгалзсан" гэж тэмдэглээд, оронд нь ганцхан токентэй хоосон placeholder тавин дамжуулах шугамаа үргэлжлүүлчихжээ!
Үр дүнд нь юу болов?
Decode GPU нь "Prefill GPU надад шинэ хэрэглэгчийн KV cache-ийг бүрэн бэлдээд илгээчихлээ" гэж итгээд санах ойг уншиж эхэлжээ. Гэвч бодит байдал дээр Prefill GPU юу ч шинээр бичээгүй байсан бөгөөд VRAM санах ойн хуудаснууд дээр хамгийн сүүлд тэр сервер дээр ажилласан огт өөр хэрэглэгчийн хувийн өгөгдөл, нууц код, prompt-үүд арчигдаагүй "бохир" хэвээрээ хэвтэж байв. Decode GPU тэрхүү хуучин өгөгдлийг уншин боловсруулж, шинэ хэрэглэгчийн дэлгэц рүү "HTTP 200 OK" амжилттай хариу болгон илгээж орхисон байна.
"AI Security бол үнэндээ Санах ойн аюулгүй байдал"
Энэхүү кейс нь хиймэл оюуны аюулгүй байдал зөвхөн "prompt injection" эсвэл "jailbreak"-ээр хязгаарлагдахгүй гэдгийг баталлаа.
Бид сүүлийн хэдэн арван жилийг C/C++ дээрх Use-after-free, Buffer Overrun, Uninitialized Memory Read зэрэг санах ойн цоорхойнуудтай тэмцэж өнгөрөөсөн. Тэгвэл өнөөдөр бид vLLM, SGLang, TensorRT-LLM зэрэг өндөр хурдны multi-tenant системүүдэд санах ойг shared pool байдлаар хувааж ашиглахдаа яг тэр сонгодог алдаануудыг GPU дээр давтан гаргаж эхэлж байна.
Cloudflare уг асуудлыг засахдаа GLM-5.3-ийн санах ойн санг 2.04 сая токен болгон өргөтгөж, контекстийн хязгаараас 2 дахин томруулсан бөгөөд SGLang багтай хамтран санах ой хуваарилагдахаас өмнө илүүдэл хүсэлтийг queue дээр нь таслан зогсоодог хамгаалалтыг хийж, SGLang v0.5.22 хувилбарт албан ёсоор оруулжээ.
Хөгжүүлэгчид ба MLOps инженерүүдийн анхаарах зүйлс
Хэрэв танай баг өөрсдийн сервер дээр (on-premise эсвэл private cloud) нээлттэй эхийн хөдөлгүүр (vLLM, SGLang г.м.) ашиглан олон хэрэглэгчид LLM үйлчилгээ үзүүлж байгаа бол дараах зүйлсийг яг одоо шалгахыг зөвлөж байна:
- SGLang ашигладаг бол яаралтай шинэчлэх: SGLang v0.5.22 болон түүнээс хойших хувилбарууд руу upgrade хийж, KV transfer checksum болон хугацаа нь дууссан санах ойг чөлөөлөх тохиргоог идэвхжүүлэх.
- Context Window vs KV Pool хэмжээг тулгах: Серверийн тохиргоо дахь context length болон VRAM KV cache pool-ийн бодит хэмжээ давхцаж байгаа эсэхийг дахин шалгах. Хэзээ ч санах ойн сангаас том контекстийг зарлаж болохгүй.
- Fail-Closed зарчим: Дэд бүтэц алдаа гарахад "чимээгүй өнгөрөөх" биш, бүрэн crash хийх (abort) нь санах ойн нууцлал задрахаас хавьгүй найдвартай хамгаалалт болдог.
Олон түрээслэгчтэй AI үйлчилгээний ард GPU санах ойн нарийн хуваарилалт явагдаж байдаг тул "Cloud AI"-д нууц түлхүүр, байгууллагын санхүүгийн болон эмзэг өгөгдлийг шууд дамжуулахдаа дэд бүтцийн түвшний ийм цоорхой үргэлж гарч болзошгүйг санаж явахад илүүдэхгүй нь.
Эх сурвалж: Cloudflare Incident Report: Cross-request KV cache exposure in the GLM-5.3 Workers AI model
Сэтгэгдэл
Ачаалж байна...