Bezpečnostní limity načítání a proudových čteček
Tento překlad je pouze informativní; v případě rozdílu má přednost zdroj v tradiční čínštině (
zh-TW).
Načítání základního balíčku a OdsStreamReader/OdtStreamReader zpracovávají nedůvěryhodný vstup ZIP/XML. Čtečky nevytvářejí úplný DOM dokumentu, ale přidělují vyrovnávací paměti pro
aktuální řádek, text uzlů, dekompresi ZIP a XML Reader. Návrh s nízkými nároky na trvalou paměť neodstraňuje
vliv velikosti vstupu.
Limity základního balíčku
OdfDocument.Load, fasády Load jednotlivých formátů a přímé volání OdfPackage.Open sdílejí rozpočty prostředků OdfLoadOptions.
| Limit | Výchozí hodnota | Účel ochrany |
|---|---|---|
| Počet položek ZIP | 5,000 | Brání vyčerpání CPU a paměti mnoha malými položkami |
| Rozbalená velikost jedné položky | 500 MiB | Omezuje rozbalení jedné položky ZIP |
| Celková rozbalená velikost balíčku | 1 GiB | Omezuje souhrnné rozbalení položek |
| Velikost původního nevyhledávatelného vstupu | 1 GiB | Omezuje vyrovnávací paměť před rozbalením ZIP |
| Znaky v jednom dokumentu XML | 64 MiB | Omezuje náklady na zpracování XML a vytvoření DOM |
Počet položek, velikost položky, celkové rozbalení a velikost původního balíčku musí být kladné. Nula nebo záporná hodnota okamžitě vyvolá ArgumentOutOfRangeException. Pouze MaxXmlCharactersInDocument = 0 vypne limit znaků XML; záporné hodnoty zůstávají neplatné.
Všechny základní XML Readery musí zakázat externí DTD a resolvery. Nové cesty načítání musí používat OdfLoadOptions nebo rovnocenné zdokumentované rozpočty. Validační cesty balíčku a Flat XML (OdfPackageValidator, OdfFlatDocumentValidator a kontroly pravidel profilů) také používají MaxXmlCharactersInDocument: balíček používá package.LoadOptions, zatímco Flat XML používá OdfValidationOptions.LoadOptions (při vynechání výchozích 64 MiB z OdfLoadOptions). Podpisy, časová razítka, data o odvolání certifikátů a externí síťové odpovědi mají vlastní menší limity; základní limit balíčku je nenahrazuje. Tyto limity chrání prostředky, nikoli obsah dokumentu; zásady vynucujte pomocí OdfPackageValidator, SanitizeMacros, ověření podpisu nebo pwsh eng/Test-OdfPolicy.ps1.
Limity proudových čteček
| Reader | Limit | Výchozí hodnota |
|---|---|---|
| ODS | Znaky XML | 64 MiB |
| ODS | Řádky na list | 1,048,576 |
| ODS | Sloupce na řádek | 16,384 |
| ODS | Jedna deklarace repeat | 1,048,576 řádků; 16,384 sloupců |
| ODS | Text načtený z jedné buňky | 16 MiB |
| ODT | Znaky XML | 64 MiB |
| ODT | Vrácené textové uzly | 1,000,000 |
| ODT | Text načtený z jednoho uzlu | 16 MiB |
Při překročení limitu načítání selže; repeat se nezkrátí a čtečka nepokračuje s vracením zdánlivě úplných dat. Takové selhání považujte za výsledek ochrany prostředků a neopakujte operaci automaticky s vypnutými limity.
Vlastnictví datových proudů
Výchozí hodnota možnosti LeaveOpen je false. Při nastavení na true se po uvolnění Readeru stále zavře
datový proud položky XML a ZIP Reader, ale nejvzdálenější datový proud poskytnutý volajícím zůstane otevřený.
Další ochrany zdrojů a výstupu
Kromě limitů balíčku a streamovaných readerů chrání před nedůvěryhodným vstupem také následující pevné limity. Tyto hodnoty jsou zatím pevné konstanty v kódu a nelze je nastavit přes OdfLoadOptions ani objekt voleb. Před zvýšením nebo odstraněním limitu posuďte dopad na paměť a zásobník.
| Oblast | Limit | Chování při překročení |
|---|---|---|
| Skutečná dekomprimovaná velikost položky ZIP | Nesmí překročit nekomprimovanou velikost deklarovanou v hlavičce (cesta MMF při načítání ze souboru) | SecurityException |
| Poškozený centrální adresář ZIP nebo ZIP64 | Rychlá cesta MMF nepodporuje ZIP64 a žádný záznam, který nelze plně zpracovat, nesmí být mlčky přeskočen | Přechod na ověření a čtení přes ZipArchive |
| Hloubka vnoření elementů XML | 256 úrovní (OdfXmlReader.MaxElementDepth); platí pro načítání DOM, načítání Flat ODF, ověřování pravidel profilu a parsování RDF |
Načtení vyvolá SecurityException; ověření hlásí ODF0303 nebo ODF0301 |
| Hloubka vnoření při parsování vzorců | Po 256 úrovních pro závorky, argumenty funkcí, vložená pole a po sobě jdoucí prefixové operátory | InvalidOperationException |
| Celkový počet uzlů operátorů ve vzorci | 4 096 (FormulaParser.MaxOperatorNodes); dohromady binární, unární, procentní a referenční operátory. Řetězené vzorce tvoří levostranně hluboké stromy, jejichž vyhodnocení a serializace rekurzí procházejí úroveň po úrovni; tento limit zajišťuje dostatečný běžný zásobník vlákna |
InvalidOperationException |
| Rezerva zásobníku při rekurzi vzorců | Parsování, vyhodnocení, získání rozsahů a serializace před vstupem do každé úrovně rekurze kontrolují zbývající zásobník (RuntimeHelpers.EnsureSufficientExecutionStack); ani vzorce blízké limitům neshodí proces na vláknech s malým zásobníkem 128–256 KB |
InsufficientExecutionStackException; EvaluateFormulas ji převede na výjimku vyhodnocení vzorce nebo #VALUE! |
| Délka řetězcového výsledku vzorce | 1 048 576 znaků (&, výsledky funkcí, SUBSTITUTE, REPT) |
Vrací #VALUE! |
| Funkce vzorců s mezí cyklu daným argumentem | BINOMDIST kumulativně 100 000; CRITBINOM, HYPGEOMDIST kumulativně 100 000; POISSON kumulativně 1 000 000; DB, DDB, VDB, CUMIPMT období 1 000 000 |
Vrací #NUM! |
| Index řádku/sloupce tabulky | Řádek 1 048 575, sloupec 16 383 (OdfSpreadsheetLimits) |
ArgumentOutOfRangeException |
| Připojení dokumentu | Dokument nelze připojit sám k sobě | ArgumentException |
Collaboration addColumns |
Omezeno počtem sloupců a celkovým počtem buněk v OdtOperationSafetyOptions |
Zaznamená bezpečnostní limit a operaci přeskočí |
| Záložní obrázek grafu | 4 096 px na stranu | Omezeno na limit |
| Formát převodu LibreOffice | Část přípony před dvojtečkou nesmí být prázdná a nesmí obsahovat .., NUL, CR ani LF |
ArgumentException |
| Dotaz SPARQL | Klauzule SERVICE není povolena (brání dotazovacímu enginu odesílat síťové požadavky na libovolné koncové body) |
ArgumentException |
Hranice důvěry
Pro nedůvěryhodné dokumenty ponechte výchozí limity a nejprve proveďte ověření package a schema. Jednotlivé
limity lze zvýšit pro důvěryhodné velké dokumenty, které je skutečně nutné zpracovat. Zvýšením limitů XML
nebo textu se však zároveň zvyšuje riziko útoku na paměť a CPU DoS. MaxXmlCharactersInDocument = 0
vypne pouze limit počtu znaků XML; ostatní limity Readeru zůstávají účinné.
Možnosti Readerů ODS a ODT ověřují stejná pravidla již při nastavení vlastnosti: limit XML přijímá nulu, ale odmítá záporné hodnoty; limity řádků, sloupců, repeat, uzlů a textu musí být větší než nula.
Bezpečnostní limity, ověřování a čištění snižují riziko, ale nepředstavují záruku absolutní bezpečnosti vůči škodlivým dokumentům.