Odkryto krytyczną podatność w LangChain Core — podstawowym pakiecie Pythona w ekosystemie LangChain, który udostępnia interfejsy i abstrakcje niezależne od konkretnego modelu dla aplikacji korzystających z dużych modeli językowych (LLM). Luka umożliwia atakującemu kradzież poufnych danych i manipulację odpowiedziami LLM za pomocą tzw. prompt injection.
Podatność oznaczono jako CVE-2025-68664 i przypisano jej ocenę CVSS 9,3/10. Zgłoszenia dokonał badacz Yarden Porat 4 grudnia 2025 r.; luka została nazwana „LangGrinch”. W komunikacie projektowym wskazano, że źródłem problemu jest podatność typu serialization injection w funkcjach dumps() i dumpd(), które nie zabezpieczają (nie „uciekają”) słowników zawierających klucze o strukturze 'lc’ podczas serializacji swobodnych słowników.
W praktyce oznacza to, że klucz 'lc’ używany wewnętrznie przez LangChain do oznaczania zserializowanych obiektów może pojawić się w danych kontrolowanych przez użytkownika. Jeśli takie dane zostaną później zdeserializowane bez właściwej walidacji, framework potraktuje je jako obiekty LangChain zamiast zwykłych danych, co pozwala na utworzenie niebezpiecznych, arbitralnych obiektów. Jak wyjaśnił Porat, gdy atakujący zmusi orkiestrację LangChain do zserializowania, a następnie zdeserializowania treści zawierającej klucz 'lc’, może to prowadzić do uruchomienia wielu „ataku-przyjaznych” ścieżek wykonania.
Skutki mogą być poważne i obejmują m.in. wydobycie sekretów z zmiennych środowiskowych, jeśli deserializacja odbywa się z opcją secrets_from_env=True (wcześniej ustawioną domyślnie), tworzenie instancji klas z zaufanych przestrzeni nazw (między innymi langchain_core, langchain i langchain_community), a nawet wykonanie złośliwego kodu poprzez szablony Jinja2. Dodatkowo błąd ucieczki umożliwia wstrzyknięcie struktur obiektów LangChain przez pola kontrolowane przez LLM, takie jak metadata, additional_kwargs czy response_metadata, co czyni prompt injection naturalnym wektorem ataku.
W odpowiedzi zespół utrzymujący projekt wprowadził poprawki zaostrzające domyślne ustawienia funkcji load() i loads(): dodano parametr allowlistowy o nazwie „allowed_objects”, pozwalający określić, które klasy mogą być serializowane/deserializowane; domyślnie zablokowano szablony Jinja2; oraz ustawiono „secrets_from_env” na False, wyłączając automatyczne ładowanie sekretów ze środowiska.
Wersje pakietu langchain-core dotknięte podatnością to: >= 1.0.0, < 1.2.5 (naprawione w 1.2.5) oraz wersje < 0.3.81 (naprawione w 0.3.81). Użytkownicy powinni jak najszybciej zaktualizować bibliotekę do jednej z wersji zawierających poprawkę.
Warto również odnotować podobną podatność w implementacji JavaScript: błąd serializacji obiektów z kluczem 'lc’ w LangChain.js, przypisany jako CVE-2025-68665 z oceną CVSS 8,6, także umożliwiał wydobycie sekretów i prompt injection. Dotknięte pakiety npm i wersje z poprawkami to: @langchain/core >= 1.0.0, < 1.1.8 (naprawione w 1.1.8); @langchain/core = 1.0.0, < 1.2.3 (naprawione w 1.2.3); langchain < 0.3.37 (naprawione w 0.3.37).
Z uwagi na wysoką krytyczność luk zalecenie jest proste: zaktualizować dotknięte biblioteki do wersji zawierających poprawki. Jak podkreśla Porat, najczęstszym wektorem ataku są pola wyników LLM, takie jak additional_kwargs czy response_metadata, które można kontrolować przez prompt injection, a następnie serializować/deserializować podczas operacji strumieniowania — to typowy przykład punktu styku „AI z klasycznym bezpieczeństwem”, gdzie wyjście modelu traktowane jest jako niezaufane wejście i może zaskoczyć organizacje, które tego nie uwzględnią.