Repository navigation
Releases
Releases · Eszetael/postgres-mcp-hardened
v0.1.11
v0.1.10
0.1.10 — reszta zewnętrznej recenzji: katalog pod listą dozwoloną, TL…
v0.1.9
0.1.9 — naprawa z 0.1.8 miała obejście na jedno słowo SELECT repeat(repeat(repeat(chr(120),1000),1000),1000) dawało dokładnie ten sam plan gigabajtowy co wersja pisana literałem. chr(120) jest wywołaniem funkcji, więc estymator rozmiaru z 0.1.8 nie umiał go zmierzyć i poddawał się, a poddanie się znaczyło przepuszczenie. Znalezione w kilkanaście minut po wydaniu, przez sprawdzenie OPUBLIKOWANEJ wersji przez npx z czystego kontenera zamiast zaufania lokalnej budowie. Dopisanie chr do listy zaprosiłoby md5, potem upper, potem następne. Reguła jest teraz ta sama, której używa PostgreSQL, decydując o zwijaniu: czy wyrażenie jest stałe. Stała jednostka o nieodczytywalnym rozmiarze liczy się jako jeden bajt i jest mnożona; jednostka z kolumny zostaje nietknięta, bo planista jej nie zwinie. 148 testów jednostkowych, 312 akceptacyjnych, 121 przypadków korpusu, 600 tys. mutacji fuzzera, 11 kontroli dokumentacyjnych.
v0.1.8
0.1.8 — wydanie bezpieczeństwa Sześć obejść obecnych w 0.1.7, znalezionych przez zewnętrzną recenzję, każde odtworzone na działającym serwerze przed naprawą. Najpoważniejsze nie wymaga żadnych uprawnień: złączenie klauzulą USING po zamaskowanej kolumnie było sprawnym oraklem równościowym. Cztery obejścia naprawione dzień wcześniej wymagały superużytkownika, to działa dla zwykłej roli tylko-do-odczytu, którą sami zalecamy. Pozostałe: db_is_local porównujący podciąg całego adresu, przez co zdalna baza mogła uchodzić za lokalną i pomijać TLS; orakl na strukturę zakazanego schematu dwiema drogami; X-Forwarded-For czytany od lewej, czyli od strony klienta, przez co oba limity dawały się obejść nagłówkiem; reset limitu przez zapełnienie mapy; fail-open strażnika kosztu przy nieczytelnym planie. Poprawiony też opis zwijania stałych: 49 bajtów SQL kosztuje backend PostgreSQL 5,9 GB pamięci i 13,7 s przy pięciosekundowym limicie czasu, który tego nie przerywa. Wzrost jest mnożny w głębokości zagnieżdżenia, a nie liniowy w stałej. 146 testów jednostkowych, 312 akceptacyjnych, 117 przypadków korpusu adwersarialnego, 600 tys. mutacji fuzzera, 11 kontroli dokumentacyjnych.
v0.1.7
0.1.7 — sześć dziur w strażniku i dwanaście fałszywych zdań o kodzie Poprawki bezpieczeństwa, wszystkie dowiedzione eksperymentalnie na żywym serwerze, nie wydedukowane: - cztery obejścia REDAKCJI, wszystkie omijające nazwy kolumn zamiast je przebierać: get_raw_page (8192 bajty strony z wartościami w jawnej postaci), pg_stats (statystyki planisty trzymają prawdziwe wartości, a zapytanie nie musi wymieniać kolumny), pg_toast (długie wartości mieszkają poza wierszem) i pg_largeobject; - zapisy przez rozszerzenia, których lista blokad nie widziała, bo rozumuje o przestrzeni katalogu: cron.schedule mogło zaplanować DROP TABLE na później, drop_chunks kasuje dane, pglogical.create_subscription ustawia replikację gdzie indziej, a TimescaleDB i PostGIS instalują się wprost do public. Wzorzec, który to zjednoczył: filtr kolumnowy chroni kolumny, więc wszystko, co czyta POD kolumnami, jest poza jego obietnicą. Instalacja jednym kliknięciem nie wystartowałaby na Windowsie: manifest wskazywał plik bez rozszerzenia .exe, a oficjalny walidator schematu tego nie widzi. Binarka schodzi z 18,9 do 9,2 MB. Projekt nigdy nie miał ustawionego profilu release, więc do każdego użytkownika szło ponad pięć megabajtów symboli debugowania. Dwanaście twierdzeń o tym kodzie było fałszywych i zostało zmierzonych na nowo, z podaniem metody: liczba pobrań, rozmiar binarki, pamięć, narzut na zapytanie, liczba przypadków testowych, obciążenie i pomyłka o jedną rewizję w sprawie samej specyfikacji MCP. Jedna granica NIE została zamknięta i jest nazwana w THREAT_MODEL: strażnik kosztu jest najdroższą częścią żądania, bo EXPLAIN VERBOSE wypisuje stałą zwiniętą przez planistę. Trzy naprawy sprawdzone i każda psuła inną kontrolę. Pięć nowych bram pilnuje tych klas błędów, każda sprawdzona przez zmuszenie jej do zapalenia się na fałszu. 131 testów jednostkowych, 290 akceptacyjnych, 108 przypadków korpusu adwersarialnego, 600 tys. mutacji fuzzera, 11 kontroli dokumentacyjnych.
v0.1.6
0.1.6 — serwer daje się obejrzeć Dwa błędy znalezione 15.08 przez pierwsze obce środowisko, które uruchomiło ten serwer. Oba tej samej natury: serwer był wrogi wobec inspekcji. - MCP_PROXY_DEBUG od mcp-proxy nie zabija już startu; literówka w naszym ustawieniu dalej kończy kodem 2. - resources/list przy nieodpowiadającej bazie zwraca pustą listę z powodem w _meta zamiast błędu protokołu. Bramy: 113 testów, 280 przypadków akceptacyjnych, CI zielone w 16 zadaniach.
v0.1.5
0.1.5 — komplet reguł rejestru wyczytany ze źródła, nie odkrywany po …
v0.1.4
0.1.4 — trzy dowody własności, których wymaga rejestr MCP - mcpName w opublikowanej paczce npm (na tym padła 0.1.3) - LABEL io.modelcontextprotocol.server.name na obrazie OCI - kontrola wszystkich trzech znaczników przy każdym commicie
v0.1.3
0.1.3 — wpis do rejestru MCP, którego odmówiła v0.1.2, plus dwie wady…
v0.1.2
Actions pinned to commits; release registers with the MCP registry