Opublikowano
Inżynieria

Wykrywacz podróbek Claude jest teraz biblioteką open source

ai-model-verifier to silnik naszego testera modeli, opublikowany w npm na licencji AGPL-3.0. Podaj mu bazowy URL, klucz i model, a powie ci, czy endpoint serwuje to, co sprzedaje, teraz z kontrolą podpisu rozumowania i rozliczania tokenów.

·4 min czytania·Autor: Zespół UnoRouter
inżynieriaogłoszenie

W kwietniu opublikowaliśmy liczby dotyczące fałszywych odsprzedawców Claude: 183 kanały u 8 dostawców, które odpowiadały jako Kiro, Codeium albo inny model z przypiętą plakietką Claude. Sondy, które je złapały, żyły w naszym potoku synchronizacji. Teraz żyją w pakiecie, który każdy może zainstalować.

ai-model-verifier jest dostępny w npm i na GitHubie na licencji AGPL-3.0. Przyjmuje bazowy URL, klucz API i nazwę modelu, a zwraca jeden z trzech werdyktów, genuine, suspicious lub unverified, razem z regułą, która zadziałała, i surowymi odpowiedziami sond.

Dlaczego biblioteka

Te same kontrole działają teraz w trzech miejscach: w twojej przeglądarce w testerze modeli, na naszych serwerach dla publicznego rankingu i w potoku synchronizacji, który decyduje, które ścieżki upstream UnoRouter w ogóle udostępnia. Trzy kopie listy wzorców rozjeżdżają się. Jeden pakiet nie.

Jest celowo izomorficzny. Tylko standardowe API webowe, żadnych importów node:, zero zależności w czasie wykonania. Wywołanie HTTP jest wstrzykiwane, więc przeglądarka może ominąć CORS, a serwer może przejść przez fetch zabezpieczony przed SSRF. Dostawcy i detektory to osobne punkty wejścia, więc sprawdzanie Anthropic nigdy nie dołącza konfiguracji Gemini.

Co nowego od kwietnia

Cztery sondy behawioralne z pierwszego wpisu nadal są rdzeniem: historia o kotku, haiku, pytanie o tożsamość i pytanie o nazwę modelu, teraz dla endpointów w formacie Anthropic, OpenAI i Gemini. Wokół nich są kontrole, które nie polegają na pytaniu modelu, kim jest.

  • Podpis rozumowania. Claude dołącza do każdego bloku rozumowania podpis generowany po stronie serwera. Relay serwujący inny model nie potrafi go wytworzyć. Sondy tożsamości da się wytrenować promptem systemowym; podpisu nie.
  • Rozliczanie tokenów. Relay może przekazywać prawdziwego Claude i mimo to zawyżać input_tokens przy każdym wywołaniu. Dwa prompty różniące się stałym fragmentem tekstu muszą różnić się liczbą rozliczonych tokenów w znanym przedziale, count_tokens musi zgadzać się z rozliczeniem, a wyjście musi mieścić się poniżej max_tokens. Opus 4.7 i 4.8 używają innego tokenizera, więc przedział jest zarazem kontrolą poziomu.
  • Niezgodność poziomu i podmiana. Rozliczany Opus, serwowany Sonnet prześlizguje się przez sondy behawioralne, bo Sonnet pisze zupełnie dobrą historię o kotku. Sonda nazwy modelu łapie odpowiedź wymieniającą tańszy poziom, a kontrola koperty łapie endpoint, który zwraca inny identyfikator modelu niż zamówiony.
  • Mieszanie odpowiedzi i przecieki języka. Każdy prompt niesie nonce. Odpowiedź zwracająca cudzy nonce oznacza, że proxy miesza odpowiedzi między użytkownikami. Znaki CJK w odpowiedzi na angielski prompt wskazują na podmieniony chiński model.
  • Metadane koperty. Identyfikator chatcmpl- w odpowiedzi w formacie Anthropic albo klucze użycia OpenAI w odpowiedzi Messages oznaczają, że między tobą a modelem siedzi warstwa tłumacząca. Raportowane jako obserwacja, nie werdykt: nasza własna bramka jest dokładnie taką warstwą.
  • Przepustowość. Większe modele są wolniejsze na token, więc ścieżka rozliczana jako Opus, a działająca z prędkością Sonnet, zasługuje na uwagę. Próbkowana, nigdy progowana: użyteczne porównanie jest między ścieżkami serwującymi ten sam model, a złożyć je może tylko wywołujący.

Czego to nie dowodzi

Poprawny podpis dowodzi, że odpowiedziała prawdziwa ścieżka Anthropic. Nie dowodzi, który poziom: Sonnet zwraca całkowicie poprawny podpis, gdy jest sprzedawany jako Opus, więc zaliczenie tutaj nadal wymaga kontroli poziomu. Odesłanie bloku rozumowania, by Anthropic ponownie zweryfikował podpis, brzmi jak test ostateczny. Zbudowaliśmy go i nie działa przez relay. Dwa działające upstreamy zwróciły 200 dla prawdziwego bloku i dla tego samego bloku z 308 bajtami losowego base64 w miejscu podpisu. Relay wysyła turę od nowa do własnego backendu, więc nic nigdy jej nie weryfikuje. Opcja jest domyślnie wyłączona i tak udokumentowana.

Kontrole podpisu i tokenów są przeniesione z veridrop, również na AGPL, którego tolerancje skalibrowano względem oficjalnego API. Zachowaliśmy te z pozoru luźne granice, bo prawdziwe odpowiedzi Anthropic leżały blisko nich.

Jak z tego korzystać

Tester modeli uruchamia pełny zestaw w twojej przeglądarce, razem z kontrolą podpisu i tokenów, i nic nie opuszcza twojej maszyny poza wywołaniami do twojego dostawcy. Strona rankingu publikuje wyniki, którymi ludzie zdecydowali się podzielić. Dla własnego potoku:

typescript
import { runVerification } from "ai-model-verifier";

const result = await runVerification({
  provider: "anthropic",
  baseUrl: "https://YOUR-PROVIDER",
  apiKey: process.env.YOUR_KEY,
  model: "claude-opus-4-8",
  mode: "server",
  checkSignature: true,
  checkTokenTruth: true,
});

console.log(result.verdict, result.reasons);
// "suspicious" [ "tier-mismatch: requested claude-opus-4-8, served sonnet" ]

Włączaj to, czego potrzebujesz. checkSignature i checkTokenTruth kosztują dodatkowe żądania, więc pozostają wyłączone, dopóki o nie nie poprosisz. Metadane koperty i przepustowość są odczytywane z odpowiedzi, które przebieg i tak wykonał, i nic nie kosztują.

Przetestuj dostawcę, przeczytaj kwietniowy wpis, by poznać liczby, od których wszystko się zaczęło, albo załóż zgłoszenie na GitHubie, jeśli prawdziwy endpoint dostaje błędny werdykt.

Powiązane posty