Галоўная / Артыкулы

Як публічныя файлы llms.txt дазволілі даследчыкам запусціць код унутры вялікіх кампаній

Даследчыкі зарэгістравалі вольныя назвы пакетаў, якія афіцыйныя файлы llms.txt раілі AI-агентам усталяваць, і за хвіліны код запусціўся ўнутры буйных кампаній. Чаму даныя цяпер — гэта код.

Выдавец: REACTAPP.TOP9 хв чытання2017 слоў

Крыніцы: Data Became Code: We Ran Code Inside Fortune 500s Using Files They Published for AI Agents

Калі публікуемы файл стае замовленнем

Команда, якая займаецца доследжэнням безпекі, адказала, што апарат у адной з компаній з лісты Fortune 500 запускаў код, які ўжо быў публікуемы, і гэта адбылося працоўна чатыры хвіліны пасля таго, як код стаў доступным. Ішлі ўсьмо ўжо за гадзіну. Па ўсходжанню доследнікаў, ніхто не скорыстаўся CVE, не падмануў працавніка і не зачапіўся за межы сеткі. Доследнікі зазначылі калькі імен, якія ўжо былі на офіцыйных файлах, якія розпавсюджвалі самыя компаніі і якія працавалі праз HTTPS, і якія падказвалі агентам AI, калі ўжо іх вікорыстоўваць.

Этыя файлы былі публічныя, а імены, якія стоялі за ўсімі імі, не былі прызначаны нікому. Агенты робілі тое, для чаго былі створаны. Тая ж самая команда таксама адказала, што пад час масовага сканавання гэтых файлоў яны натрапілі на ўжо дзейнуючую атаку: файл інструкцый канпаніі-продавца, які падказваў агентам пра парадыжаны зловучы код. Гэты прыклад паказаны ніжэй.

Спачатку — фон.

Чаму llms.txt мае значэнне тут

Прасцягом большай часткі історыі Інтэрнэту старонка на сайце была простаў старонкай. Людзі моглі яе прачытаць, сканеры — адшукаць ў індэксе, але ніхто не спрыяваў яе вжыцю як каманды. Гэта ўжо не так.

Компаніі зараз размешчаюць на корэні своіх сайтаў новы тып файлу паляглы ўсерэдыне robots.txt: llms.txt, а інодзе і дыявольшы ленгвістычны файл llms-full.txt. Гэта не схема сайта і не прававая адмова. Ён выступае як структураваны набор інструкцыйяў для AI-агентаў, якія паведамляюць, што чытаць, якія API выклікаць, якія пакеты інсталаваць і якім доменам даверыць. Лабораторыі большых модэляў публікуюць свае власныя файлы, а інструмент Lighthouse ад Google у Chrome DevTools цяпер мае функцыю аўдыту пад назвай „agentic browsing“, якая прабуе прымусіць сайты стварыць такі файл. Колькасць гэтых файлаў стагнае ў аднам напрамку.

Команда пачала выявляць, насколькі шырока была распространена гэтая шара інструкцыйяў. Іхныя падсчыты паказалі: 8,565 файлаў llms.txt на 6,214 доменах у рэальнам часе, з апошніх прыблізна 15,000 кампаній, якія былі у каталозе. Серэд тых, хто публікуў гэтыя файлы, былі вялікія падпрыемства, тэхналогічныя гіганты, компаніі у сферэ фінтэху і прадавцы вайсковых тэхналогій.

Тыповы файл направляе агента да дасяглібнай інформацыі, логу змян і форума спяльнай аўдыторыі, а пасля — да каманды для інсталяцыі, падобнай да pip install для SDK кампаніі. Гэтыя інструкцыі выглядаюць корыстнымі і офіцыйнымі, і яны надходзяць з сэрвера самай кампаніі праз протакол HTTPS. Агент для програмавання на AI, які запрашаецца аб інтэграцыі з гэтым продуктам, прачытае гэтыя інструкцыі і ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо

Наступныя запытаннія былі працоўна простымі: хто на самай працоўнай адпавядае за тое імёна пакета на PyPI? У кожным разе адказ быў — ніхто. Імя знаходзілася ў афіцыйным файле першага выдавача, а пакет, на які ён вялі, ніколі не быў заявлены. Хто першы, той і адпавядае.

Дзеярнікі перагледзелі ўсё больш файлоў, потым сотні, а пасля большасць з іх, і ўсюды бачылі тое ж. Інструкцыі з інсталяцыі называлі пакеты і домены, якія ніхто не зарэгістраваў. Па ўсмысле дзеярнікаў, гэтыя пакеты не былі "патэнцыйна вразлежнымі", а проста былі доступныя. Гэта таксама не ўзлам пад выманом. Імены ў файлах напісаны правільна, таму няма памылак, якія можна было б знайсці, адтуды што рэгістрацыяў ніколі не было.

Як код атрымаў можласць выканання ў вялікіх компаніях

Команда выбрала невялы калек пакетных імен, які з’являліся ў файлах llms.txt вядомых компаній, і зарэгістравала іх у PyPI і npm. Кожны пакет мяў адну безнебедную функцыю повернення інформацыі — мінімальны сігнал, які паведамляў пра тое, што адбылася установка ў інфраструктуру, якой керавалі дзеярнікі. Пасля чаго яны чакалі.

Першы сігнал повернення прыйшоў за меней чым чатыры хвіліны. Конкрэтна, дзе-небудзь у компаніі з капіталам у калькілька сотак мільярдаў долераў, штучны інтэлект вычытаў файл llms.txt на сайце компаніі, знайшоў рэчэнне pip install і запусціў яго. Пакет прыйшоў з PyPI, як і было напісана ў файле, хоць цэў быў пакет дзеярнікав. Другі сігнал з компаніі з лісты Fortune 500 прыйшоў за гадзіну, а ўсьмох дзесяткаў іншых прыйшло як з стартапаў, так і з карпорацый; у дзеярых з яных команды безпекі былі большыя, чым усе професійныя сеткі дзеярнікав.

Іхній вывад гласыць, што яны не працавалі з абаранасамі каго-небудзь, а выкорысталіся ланцугам довер'я.

Як агенты самі знаходзяць гэтыя файлы

У эксперыменце пасля таго было выявлена, як мало падказакоў трэба. Научнікі прыменялі пяць разных настройкаў у двух агентных CLI-сістэмах, давалі кожнай з іх тую ж фразу 100 разоў, не дадзялі ў яе нічога, кроме імені прадавца. У фразе была просьба да агента выкарыстаць усі дакументы таго прадавца, каб створыць і запустыць праект на Node.js з яго SDK.

Гэта была вся прыгласоўка. У яй не было ні URL, ні паўязі на дасведчэнні, ні аднароджэння llms.txt. Не было ні встромкі прыгласоўкі, ні нападчыка ў цыкле, ні соцыяльнага інжынірынгу. Агент сам выканаў пошук каналу інструкцый, таму што самэ гэта і было мэтай яго стварэння — вышукванне афіцыйных дасведчэнняў прадавца. Команда стварыла статыстыку, сколькі з 100 запускаў па кожной конфігурацыі перайшла да llms.txt, побачыла команду і запісала пакет, які ніхто не зарэўстраваў.

Пакеты былі бездзейныя за прызначэнням, толькі сігналы. Усё, што было да гэтага моменту, было кантролюемым даследжэннем. Тое, што адбываецца далей, — гэта адзінэцкі інцыдэнт, які быў адкрыты падчас аналізу корпусу.

Казус, які вядомы ў рэальным свеце

Адна знаходка зупініла команду, таму што гэта вядома ўжо адбывалася.

Clerk – прадаўець абліковых рашынкаў, чыяі SDK-ы вікорыстоўваюцца ў большай часткі праектаў Next.js, – публікуе дасягчальнасць, напісаную для AI-агентаў. Агент, які следуе за гэтым напамінанням, прабягае да дасягчальнасці Clerk’s llms.txt, якая містыць інструкцыі па выправленні проблем з аблікованнем, і ў яй ёсць такы каманд:

npx clerk-next-fix-auth-protection

Агент чытае гэты тэкст і выканае яго, што не ўдзівляе, калі мова йдэ пра інструкцыі безпосерэдна ад продавца.

Проблема не ў неправільна напісаным імені пакета. Сама команда clerk-next-fix-auth-protection — гэта бінарны файл, які ўключаны ў пакет Clerk з абмежэнным доступам @clerk/eslint-plugin. У дасведчальных матэрыалах працоўнікам рэкомендуецца спачатку інсталаваць пакет з абмежэнным доступам, а потым вызваць саму команду. Але калі команда запускаецца раней, чым пакет інсталаваны локальна, npx шукае яго назву ў публічным рэжыстрэ npm, дзе Clerk ніколі не публікувала яго як самастоятэльны пакет.

Іншы чалавек заместа яго зарэгістраваў. За апісаннем дзеячых, у пакеце няма функцыональнага коду, але ў момент установкі ён запускае хукі, якія з кожной установкі даюць імя паведамчыка, назву апарата, катэгорыю працы і час падзеі на зовнішній сервер. Ён каталогаваны як MAL-2026-11069 па CWE-506, «вбудоўаны зловучы код», і быў пазначаны сістэмамі Google OSV.dev і Amazon Inspector. Дакументацыя, відкрытыя параметры і аб’екты выканання застаюцца тыпавымі незалежна ад таго, чы пакет захопляе імя паведамчыка чы стварае цэлы «заднія дверы». Механізм распространення — гэта сама вразломнае месца, а пакет ёсць толькі варыянтам.

Раследаванне было практычна адміністрацыі Clerk, якія быстра адказала і выправіла сітуацыю. У аналізе падчэркнуўся, што гэта не ўзрада проты Clerk. Трэцяя сторона зарэўнавала пакет, скорастаючыся з плутанням у іменах npx, і Clerk не мела ніякога кантролю над гэтым. Команда паказвае гэта як падтверджаны прыклад структурнага проблемы, якая выражаецца ў будзь-кампаніі, якая публікуе дакументацыю, чытальную для агентаў.

Чаму ныякія сучасныя меры захоплення можаць не зазначыць гэта

Кожны сігнал, на які спакоюеся аб’ект безпекі, тут вядзе не туды. Агент, які зустрочае файл llms.txt, бачыць файл, які надаецца праз HTTPS з офіцыяльнага домэна, у стандартным фармаце, прызначанам для вікорыстання AI, публікуемым компаніяй або ўпартнерам, якому яна давае довярэнне. У агента майжэ нема прычын сумневацца ў чым-небудзь з гэтага, адколі сам файл ёсць автантычным джэрэлам інфармацыі.

Калі файл прасіць запусціць адміністрацыйскі інструмент, агент не зупіняецца, каб пераканацца, чы роўна ўжо існуе такі продукт у компаніі. Ён не пераглядае простора імен PyPI, і не з’яўляецца, што лінк да дасведчэнняў вядзе на домен, рэгістрацыя якога заканчылася тры месцы таму. Агент проста рабіць тое, што прасіць файл.

Доверлівасць таксама ўзаемна. Файл llms.txt не павінен знаходзіцца на сайце цэльвай компаніі. Агенты беруць неабходны кантэкст з доверлівых трэціх сторон — напрыклад, з дасведчэнняў партнера, справакі SDK апрантара чы сторанкі налаштаванняя праекту спальноты. Калі агент доверае той трэцій стороне, а файл той стороны вядзе на пакет, які ніхто не выкарыстоўвае, то ланцуг дзейнаў так сама.

Адэнтпаінт-дыягностыка таксама нічога не паказала. Для інструмента EDR чыра проксі гэта выглядае як работа распрацоўшчыка з законным менеджэрам пакетаў: pip install на pypi.org, домэне, які разрашае кожны корпаратыўны проксі, з агентам для кодавання, які компанія намерна разместыла як галоўны працэс. Не існуе ніякіх анамалій чыра паведамленняў. Прычына аблукі знаходзіцца вышэй, у прыеме межаў между інструкцыяй чыра екзэкуцыяй, і адэнтпаінт не можа яе з’явіць, таму што яму ніколі не была задана правільная запытка.

Даныя, якія сталі кодам

На працоўнія гадоў людзі спрыёмлівалі контэнт. Цяпер штучныя інтэлектуальныя агенты часта ўпершыню яго чытаюць, аналізуюць і дзеяюць на ўжытак яго. Гэта тая сама катэгорыяльная памылка, ў якую разам падаўся весь рынак: межа між данымі і кодам знікла. Усё, што знаходзіцца на вашай веб-сторанцы, больш не ёсць проста контэнтам. Гэта оператыўны вхідны матэрыял, фактычна код, які запускаецца ў чужой асяроддзі з тымі правамі, якія мае агент.

Гэта перакручвае старую прыпуск. Сторанцы і документы раней за сваёю прыродай вважаліся менш рызыкавымі, таму што ніхто не спрыягаў іх як выконвальны код, тэму ніхто не врачываў бюджэт на ўтрыманне іх цэліснасці. Калі даныя ёсць кодам, цэліснасць даных стае часткай бюджэту на безпеку.

Больш, чым адна файл

llms.txt — гэта не весь атакаваемы лоск. Гэта першая траса, якая паказвае, што структура зменілася. Кожны лоск, даўжыну якога адчувае агент, стае месцам, дзе можа прыйсці інструкцыя, і ніхто з гэтых месцаў не быў спраектаваны з контролем цэласці.

Паглядзіце, што на самай працэ агент прыймае: офіцыйныя рэпазітарыі GitHub, дакументацыю, спальні і форумы, вашы заявкі і электраняўку. Ужо двацьць гадоў гэты кантэнт быў напісаны для людзей, і ніхто не ставіў над якім контролю цэласці, таму што кантэнт не могаў нічага зрабіць. Гэты свет знік. Весь массів дадзеных, да якога падключэныя агенты, таямна стаў плошчай для выканання.

Настоямы аб’ект — гэта не адні файл і не адна база дадзеных. Самыя дадзеныя змінілі свой характар, а індустрыя безпекі яшчэ намагаецца ўжыцься.

Ціфры за доследжэнням

  • Размах карпуса: 8,565 файлаў llms.txt з 6,214 актывах домэнаў, выявленых з спісу абоўша 15,000 компаній.
  • Больш чым 237 незахаваных артыфактов, якія называюцца інструкцыямі па інсталляцыі чы сэтапаванню: назвы пакетаў, домэны і паддомэны. Кожны з іх, за словамі дзеяраў, мог быць захаваны, прычаму большасць з іх — безкоштовна.
  • Было адбіта шасць экасістэм: PyPI, npm, RubyGems, NuGet, crates.io і Packagist. У частцы домэнаў былі незахаваныя імены .dev і .io, а таксама паддомэны на Render, Vercel, Fly і Netlify, якія ўсе застаўаліся доступнымі для захавання.

Што можу выкарыстаць захістнікі

Дзеяры апісваюць llms.txt як толькі першы элемент, які ўжо быў выявлен, і спакушаюцца, што будуць адкрывацца ўсё большыя спосабы атак. З іхніх звесткаў вылейваюцца калькі практычных наступнэйстваў:

  • Аудыруйце файлы, якія выдаюцца вашым агентам. Кожна назва пакета, домэн і сабдомэн, якія ў іх згадваюцца, должны быць зарэўнаваныя, належаць вам і пераблюдваныя.
  • Заўодзіце каманды з дасяглівай документацыі, вказываючы назву пакета. Назва бінарнага файла можа быць знайдзена ў публічным рэестры, калі локальная установка ўжо не адбылася.
  • Спрыятліва ставіцеся да дасягліваў трэціх сторон, якія вашы агенты выкарыстоўваюць, як да часткі ланца саплыву, таму што довер'е пераходзіць ад іх.
  • Памятайце, што стандартныя інструменты канцачных тэрмінаў бачаць толькі звычайную установку пакета і не будуць яе фіксаваць, таму контроль неабходна адбывацца раней, на этапе выдачы інструкцый і пошуку ў рэестры.

За данымі заявы пра адкрасць, у эксперыменце не было ніякога шкоды. Ніякая перзастойнае інфармацыя не была размешчана, ніякія даныя не былі вынесены; рэзультаты эксперыменту адпаведальна падаюцься на ведомасць арганізацыям, якія падвергліся вплыву, а назвы компаній залішаюцца анонімнымі пакуль трывае усуненне проблемы.

Спадні матэрыялы

  • Практычныя прытамулі: распрацоўшчыкі TypeScript выкарыстоўваюць Zod неправа. Гэта не проста — паследовы апіс працы з прытамулом «Практычныя прытамулі: распрацоўшчыкі TypeScript выкарыстоўваюць Zod неправа. Гэта не проста»: контракты, перакананні і месцы для коду для команд, якія вікорыстоўваюць гэты патэрн.