Krytyczna luka bezpieczeństwa w LangChain Core naraża dane użytkowników
W LangChain Core ujawniono poważną lukę w zabezpieczeniach, która może zostać wykorzystana przez atakującego do kradzieży wrażliwych informacji oraz wpływania na odpowiedzi modeli językowych (LLM) poprzez wstrzyknięcie komend.
LangChain Core (czyli langchain-core) to podstawowy pakiet Pythona wchodzący w skład ekosystemu LangChain, który zapewnia interfejsy i abstrakcje niezwiązane z modelami do budowy aplikacji korzystających z LLM.
Poważna podatność o wysokiej punktacji CVSS
Luka, oznaczona jako CVE-2025-68664, ma wynik CVSS 9.3 na 10. Pracujący nad bezpieczeństwem badacz Yarden Porat zgłosił tę podatność 4 grudnia 2025 roku. Otrzymała ona kodową nazwę LangGrinch.
„W LangChain występuje podatność na wstrzyknięcie podczas serializacji w funkcjach dumps() i dumpd()” – poinformowali opiekunowie projektu w komunikacie. „Funkcje te nie escape’ują słowników z kluczami 'lc’ podczas serializacji swobodnych słowników.”
Klucz 'lc’ jest używany wewnętrznie przez LangChain do oznaczania obiektów podczas serializacji. Gdy dane kontrolowane przez użytkownika zawierają tę strukturę klucza, są traktowane jako prawidłowy obiekt LangChain podczas deserializacji, a nie jako zwykłe dane użytkownika.
Według badacza Cyata, Porata, sedno problemu polega na tym, że wspomniane funkcje nie escape’ują słowników kontrolowanych przez użytkowników, które zawierają klucze 'lc’. Znak 'lc’ reprezentuje obiekty LangChain w wewnętrznym formacie serializacji frameworka.
Przykłady możliwych skutków
„Kiedy atakujący jest w stanie spowodować, że pętla orkiestracji LangChain zserializuje, a potem deserializuje treści zawierające klucz 'lc’, mogą zainstancjować niebezpieczny obiekt, co potencjalnie uruchomi wiele ścieżek sprzyjających atakowi” – podkreślił Porat.
Może to prowadzić do różnych wyników, w tym do ekstrakcji sekretów z zmiennych środowiskowych podczas deserializacji, gdy secrets_from_env=True (wcześniej ustawione domyślnie), tworzenia klas w zaufanych przestrzeniach nazw, takich jak langchain_core, langchain i langchain_community, a nawet do wykonania dowolnego kodu poprzez szablony Jinja2.
Co więcej, błąd związany z escape’owaniem umożliwia wstrzykiwanie struktur obiektów LangChain przez pola kontrolowane przez użytkownika, takie jak metadata, additional_kwargs lub response_metadata poprzez wstrzyknięcie komend.
Patch i zalecenie aktualizacji
Łatka wydana przez LangChain wprowadza nowe restrykcyjne domyślne ustawienia w funkcjach load() i loads() poprzez parametr allowlist „allowed_objects”, który pozwala użytkownikom określić, które klasy mogą być serializowane/deserializowane. Dodatkowo, szablony Jinja2 są domyślnie blokowane, a opcja secrets_from_env została ustawiona na False, aby wyłączyć automatyczne ładowanie sekretów z otoczenia.
Następujące wersje langchain-core są dotknięte przez CVE-2025-68664 – >= 1.0.0, < 1.2.5 (naprawione w 1.2.5) oraz < 0.3.81 (naprawione w 0.3.81).
Warto dodać, że w LangChain.js występuje podobna luka podatności na wstrzyknięcie, również związana z nieprawidłowym escape’owaniem obiektów z kluczami 'lc’, co umożliwia ekstrakcję sekretów i wstrzyknięcie komend. Ta podatność ma przypisany identyfikator CVE CVE-2025-68665 (wynik CVSS: 8.6).
Dotyczy to następujących paczek npm – @langchain/core >= 1.0.0, < 1.1.8 (naprawione w 1.1.8), @langchain/core < 0.3.80 (naprawione w 0.3.80), langchain >= 1.0.0, < 1.2.3 (naprawione w 1.2.3) oraz langchain < 0.3.37 (naprawione w 0.3.37).
Zalecenia dla użytkowników
W związku z krytycznością tej luki zaleca się użytkownikom jak najszybsze zaktualizowanie do naprawionej wersji w celu zapewnienia optymalnej ochrony.
„Najczęstszym wektorem ataku są pola odpowiedzi LLM, takie jak additional_kwargs lub response_metadata, które mogą być kontrolowane przez wstrzyknięcie komend i następnie serializowane/deserializowane w operacjach strumieniowych” – zauważył Porat. „To dokładnie taki rodzaj 'sztucznej inteligencji w połączeniu z klasycznym bezpieczeństwem’, w którym organizacje mogą być zaskoczone. Wynik LLM to niezaufany input.”












