{"id":314,"date":"2026-08-17T20:59:37","date_gmt":"2026-08-17T20:59:37","guid":{"rendered":"https:\/\/fikresekhel.com\/blog\/?p=314"},"modified":"2026-08-17T20:59:37","modified_gmt":"2026-08-17T20:59:37","slug":"de-codigo-javascript-a-uma-propriedade-formal-como-encontramos-um-possivel-vetor-de-exaustao-de-recursos-usando-lean-experimentacao-e-analise-de-seguranca","status":"publish","type":"post","link":"https:\/\/fikresekhel.com\/blog\/secure-coding\/de-codigo-javascript-a-uma-propriedade-formal-como-encontramos-um-possivel-vetor-de-exaustao-de-recursos-usando-lean-experimentacao-e-analise-de-seguranca\/","title":{"rendered":"De c\u00f3digo JavaScript a uma propriedade formal: como encontramos um poss\u00edvel vetor de exaust\u00e3o de recursos usando Lean, experimenta\u00e7\u00e3o e an\u00e1lise de seguran\u00e7a"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introdu\u00e7\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">M\u00e9todos formais costumam aparecer em discuss\u00f5es de seguran\u00e7a cercados por exemplos acad\u00eamicos: protocolos simplificados, m\u00e1quinas de estado artificiais, propriedades matem\u00e1ticas elegantes e sistemas constru\u00eddos especificamente para serem verificados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas o que acontece quando aplicamos essa forma de racioc\u00ednio a uma biblioteca criptogr\u00e1fica real?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Foi exatamente esse o objetivo deste trabalho.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Partimos de uma biblioteca TypeScript\/JavaScript existente, analisamos sua arquitetura criptogr\u00e1fica, formulamos propriedades de seguran\u00e7a, constru\u00edmos experimentos controlados e utilizamos <strong>Lean 4<\/strong> para formalizar partes relevantes do comportamento observado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Durante esse processo, chegamos a um candidate finding particularmente interessante:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Um ciphertext pequeno e n\u00e3o autenticado pode controlar par\u00e2metros do Argon2id e provocar consumo significativo de recursos antes que a autentica\u00e7\u00e3o AES-GCM finalmente rejeite o ciphertext.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Em nossos experimentos, duas opera\u00e7\u00f5es concorrentes com ciphertexts adulterados levaram o processo Node.js a um pico observado de aproximadamente <strong>8 GB de working set<\/strong>, embora ambas terminassem posteriormente em <code>DECRYPTION_FAILED<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mais interessante que o finding isoladamente, por\u00e9m, \u00e9 <strong>como chegamos at\u00e9 ele<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este artigo apresenta esse caminho.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. O objetivo n\u00e3o era \u201cca\u00e7ar vulnerabilidades\u201d<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">O projeto come\u00e7ou com uma pergunta diferente:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Podemos pegar uma biblioteca criptogr\u00e1fica real e transformar suas garantias de seguran\u00e7a em propriedades que possam ser investigadas experimentalmente e formalizadas?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Essa diferen\u00e7a de abordagem \u00e9 importante.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em vez de come\u00e7ar procurando padr\u00f5es conhecidos de vulnerabilidade, come\u00e7amos identificando as <strong>propriedades que deveriam permanecer verdadeiras<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por exemplo:Decryptk\u200b(Encryptk\u200b(m))=m<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Essa \u00e9 uma propriedade funcional b\u00e1sica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas tamb\u00e9m podemos formular propriedades de seguran\u00e7a:Tamper(C)\u21d2Reject(C)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ou:WrongKey\u21d2Reject<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">e:WrongAAD\u21d2Reject<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A mudan\u00e7a conceitual \u00e9 pequena, mas poderosa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em vez de perguntar:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cExiste um bug aqui?\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">passamos a perguntar:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cQuais propriedades precisam permanecer verdadeiras para que esse sistema seja seguro?\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">E ent\u00e3o tentamos quebr\u00e1-las.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. O alvo da an\u00e1lise<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">O laborat\u00f3rio foi realizado sobre uma pequena biblioteca criptogr\u00e1fica TypeScript\/JavaScript.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A vers\u00e3o analisada implementava, entre outros mecanismos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AES-256-GCM;<\/li>\n\n\n\n<li>Argon2id;<\/li>\n\n\n\n<li>ciphertexts versionados;<\/li>\n\n\n\n<li>par\u00e2metros KDF armazenados no pr\u00f3prio ciphertext;<\/li>\n\n\n\n<li>AAD;<\/li>\n\n\n\n<li>autentica\u00e7\u00e3o de ciphertext;<\/li>\n\n\n\n<li>suporte a Node.js e browser;<\/li>\n\n\n\n<li>compatibilidade com formatos anteriores.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A arquitetura conceitual que nos interessava inicialmente era aproximadamente:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Application    \u2502    \u25bcCrypto API    \u2502    \u25bcKDF    \u2502    \u25bcAES-GCM    \u2502    \u25bcCiphertext container \u250c\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2510salt IV  tag   ciphertext<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nosso primeiro objetivo era entender quatro coisas:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Onde a chave chega ao AES-GCM?De onde vem o IV?Onde o authentication tag \u00e9 produzido e verificado?O que acontece quando a autentica\u00e7\u00e3o falha?<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Isso nos levou diretamente ao c\u00f3digo respons\u00e1vel pela decripta\u00e7\u00e3o.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. Primeiro princ\u00edpio: transformar documenta\u00e7\u00e3o em propriedades<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Uma biblioteca criptogr\u00e1fica normalmente apresenta afirma\u00e7\u00f5es como:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">ciphertext adulterado deve ser rejeitado.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Isso pode ser transformado em uma propriedade:C\u2032\ue020=C\u21d2Decrypt(C\u2032)=Failure<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Claro que essa formula\u00e7\u00e3o ainda \u00e9 simplificada demais para representar AES-GCM corretamente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas ela nos d\u00e1 algo extremamente \u00fatil:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>uma propriedade test\u00e1vel.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Come\u00e7amos ent\u00e3o pelos casos mais \u00f3bvios.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. Experimento 1 \u2014 adulterando o ciphertext<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Produzimos um ciphertext v\u00e1lido e modificamos um byte.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceitualmente:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Original:66 77 61 2f ...Tampered:67 77 61 2f ...<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A altera\u00e7\u00e3o foi m\u00ednima:0x66\u22950x01=0x67<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A biblioteca rejeitou o resultado:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Decryption rejected.Type: DECRYPTION_FAILEDCode: DECRYPTION_FAILED<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Primeira propriedade observada:TamperedCiphertext\u21d2Reject<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At\u00e9 aqui, comportamento esperado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas ent\u00e3o fizemos algo diferente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Formalizamos a ideia.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Levando a propriedade para Lean<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Criamos uma representa\u00e7\u00e3o m\u00ednima de ciphertext:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">abbrev Ciphertext := List UInt8<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">E uma opera\u00e7\u00e3o de adultera\u00e7\u00e3o:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">def tamperFirstByte (c : Ciphertext) : Ciphertext :=  match c with  | [] =&gt; []  | b :: rest =&gt; (b ^^^ 1) :: rest<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Primeiro provamos que a opera\u00e7\u00e3o realmente altera um ciphertext n\u00e3o vazio:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">theorem tamper_changes_nonempty    (b : UInt8)    (rest : List UInt8) :    tamperFirstByte (b :: rest) \u2260 (b :: rest) := by  intro h  simp [tamperFirstByte] at h  bv_decide<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Depois constru\u00edmos um modelo abstrato de rejei\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A ideia era simples:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">received == expected        \u2193      successreceived != expected        \u2193      failure<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">E provamos no modelo:Tamper(C)\u21d2Reject(C)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso n\u00e3o prova AES-GCM.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tamb\u00e9m n\u00e3o prova a implementa\u00e7\u00e3o JavaScript.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prova uma propriedade do <strong>modelo que constru\u00edmos<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Essa distin\u00e7\u00e3o se tornaria fundamental posteriormente.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. Construindo evid\u00eancia em v\u00e1rias camadas<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Repetimos o processo para diferentes componentes autenticados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Testamos:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">ciphertext alterado \u2192 rejeitadotag alterada        \u2192 rejeitadachave incorreta     \u2192 rejeitadaAAD incorreto       \u2192 rejeitadoIV incorreto        \u2192 rejeitado<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cada experimento produzia evid\u00eancia concreta da implementa\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Paralelamente, criamos modelos em Lean para representar as propriedades correspondentes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O resultado come\u00e7ou a formar uma cadeia:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Documenta\u00e7\u00e3o      \u2193Propriedade esperada      \u2193C\u00f3digo      \u2193Experimento      \u2193Modelo      \u2193Teorema<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">E foi justamente seguindo essa cadeia que encontramos algo mais interessante.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. O primeiro comportamento inesperado: compatibilidade legada<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Durante a an\u00e1lise dos testes do pr\u00f3prio projeto, encontramos refer\u00eancias a uma configura\u00e7\u00e3o relacionada \u00e0 autentica\u00e7\u00e3o do header v1.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O comportamento legado existia para permitir compatibilidade com ciphertexts antigos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No modo atual, o header era incorporado ao AAD.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceitualmente:AAD=Context\u2225Header<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No modo legado:AAD=Context<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O header deixava de participar diretamente da autentica\u00e7\u00e3o AES-GCM.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso imediatamente levantou uma pergunta:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">O modo legado serve apenas para <strong>ler<\/strong> ciphertexts antigos ou tamb\u00e9m afeta a cria\u00e7\u00e3o de <strong>novos<\/strong> ciphertexts?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Seguimos o fluxo no c\u00f3digo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E encontramos que a mesma decis\u00e3o era utilizada no caminho de encryption.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em termos simplificados:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">legacyHeaderAad = falseAAD = context || header<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">enquanto:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">legacyHeaderAad = trueAAD = context<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Isso significava que o modo de compatibilidade tamb\u00e9m poderia produzir novos ciphertexts utilizando a sem\u00e2ntica legada.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Reproduzindo o comportamento<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Criamos ent\u00e3o um novo ciphertext com o modo legado habilitado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Depois modificamos o primeiro byte reservado do header:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Byte original:    0Byte adulterado: 255<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O resultado foi particularmente interessante.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No modo legado:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Legacy decrypt ACCEPTED tampered ciphertext<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">No modo atual\/default:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Default decrypt REJECTEDCode: DECRYPTION_FAILED<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mas ainda n\u00e3o t\u00ednhamos necessariamente uma vulnerabilidade.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Precis\u00e1vamos entender <strong>por qu\u00ea<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. O parser mudou completamente a interpreta\u00e7\u00e3o<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Inspecionando o parser do formato v1, identificamos o layout relevante:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">0\u20133    magic4      version5      KDF ID6\u20139    memoryCost10\u201313  timeCost14\u201315  parallelism16\u201321  reserved<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O detalhe crucial:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>os bytes reservados n\u00e3o eram utilizados semanticamente pelo parser.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Portanto, modificar:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">byte 16<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">n\u00e3o alterava:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>a chave;<\/li>\n\n\n\n<li>o KDF;<\/li>\n\n\n\n<li>os par\u00e2metros;<\/li>\n\n\n\n<li>o IV;<\/li>\n\n\n\n<li>o ciphertext.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">No modo legado, aquele byte tamb\u00e9m n\u00e3o participava do AAD.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Consequentemente:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">reserved byte modified        \u2193parser ignores it        \u2193AAD does not contain it        \u2193same key        \u2193same authentication relation        \u2193decryption succeeds<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">No modo seguro:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">reserved byte modified        \u2193header participates in AAD        \u2193AAD changes        \u2193GCM authentication fails<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Agora t\u00ednhamos uma explica\u00e7\u00e3o estrutural.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Formalizando os dois modos<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Representamos essa diferen\u00e7a em Lean:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">inductive HeaderMode where  | secure  | legacy<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O estado abstrato possu\u00eda duas propriedades:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">structure AuthenticatedState where  payloadAuthenticated : Bool  headerMatches : Bool<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">No modo seguro:Success\u27faPayloadAuthenticated\u2227HeaderMatches<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No modo legado:Success\u27faPayloadAuthenticated<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso permitiu provar:Secure\u2227HeaderModified\u21d2Failure<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">e:Legacy\u2227PayloadValid\u2227HeaderModified\u21d2Success<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Novamente:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Lean n\u00e3o estava descobrindo o comportamento do JavaScript.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ele estava nos obrigando a escrever precisamente qual propriedade acredit\u00e1vamos que o sistema possu\u00eda.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Essa disciplina acabou sendo extremamente \u00fatil.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. Nem toda adultera\u00e7\u00e3o do header funcionava<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Aqui aconteceu uma parte particularmente importante da investiga\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poder\u00edamos ter parado no primeiro comportamento interessante e conclu\u00eddo:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cO header n\u00e3o \u00e9 protegido no modo legado.\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Mas isso seria uma simplifica\u00e7\u00e3o excessiva.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Decidimos modificar outro campo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Desta vez:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">memoryCost<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Original:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">4096<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Adulterado:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">8192<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Resultado:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">DECRYPTION_FAILED<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Por qu\u00ea?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Porque <code>memoryCost<\/code> n\u00e3o \u00e9 apenas metadata.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ele participa da deriva\u00e7\u00e3o da chave.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Assim:memoryCost\u2032\ue020=memoryCost<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">faz com que:KDF(password,salt,params\u2032)\ue020=KDF(password,salt,params)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">e consequentemente:K\u2032\ue020=K<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A autentica\u00e7\u00e3o AES-GCM falha.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso nos deu uma distin\u00e7\u00e3o muito mais precisa:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Alguns campos do header n\u00e3o estavam diretamente vinculados ao AAD no modo legado, mas altera\u00e7\u00f5es em campos semanticamente utilizados pelo KDF ainda poderiam ser detectadas indiretamente por produzirem uma chave diferente.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Esse tipo de refinamento \u00e9 exatamente o que uma an\u00e1lise s\u00e9ria precisa fazer.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. E ent\u00e3o apareceu uma pergunta diferente<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Enquanto investig\u00e1vamos <code>memoryCost<\/code>, percebemos algo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para descobrir que a chave estava errada, o sistema precisava primeiro <strong>calcular a chave<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ou seja:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">ciphertext    \u2193parse header    \u2193read memoryCost    \u2193execute Argon2id    \u2193derive key    \u2193AES-GCM    \u2193authentication failure<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ent\u00e3o fizemos uma nova pergunta:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Quem controla o custo do Argon2id antes da autentica\u00e7\u00e3o?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">A resposta era:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>o pr\u00f3prio ciphertext.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esse foi o ponto em que a investiga\u00e7\u00e3o mudou de dire\u00e7\u00e3o.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Da integridade para disponibilidade<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">At\u00e9 aquele momento est\u00e1vamos essencialmente estudando:Integrity<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Agora surgiu uma propriedade relacionada a:Availability<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poder\u00edamos formul\u00e1-la informalmente como:UntrustedInput\ue020\u21d2ExcessivePreAuthenticationWork<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas o fluxo parecia permitir:UnauthenticatedHeader\u2192KDFParameters\u2192ExpensiveKDF\u2192Authentication<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ou seja, o sistema precisava gastar recursos antes de saber se aquele ciphertext era leg\u00edtimo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Mas havia limites<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A implementa\u00e7\u00e3o n\u00e3o aceitava qualquer valor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Testamos:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">memoryCost = 4,294,967,295<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Resultado:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">INVALID_INPUTKDF_PARAMS_OUT_OF_BOUNDS<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O pr\u00f3prio erro revelou os limites:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">memoryCost  &lt;= 4,194,304timeCost    &lt;= 100parallelism &lt;= 64<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Isso \u00e9 importante.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00e3o seria correto escrever:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cA biblioteca permite memoryCost arbitr\u00e1rio.\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Ela n\u00e3o permite.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Existe uma mitiga\u00e7\u00e3o expl\u00edcita.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A pergunta correta passou a ser:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">O maior valor <strong>permitido<\/strong> ainda \u00e9 perigoso em um contexto de input n\u00e3o confi\u00e1vel?<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. Testando exatamente o boundary<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Alteramos ent\u00e3o:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">memoryCost = 4,194,304<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ou seja:memoryCost=MAX<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O parser aceitou.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O Argon2id foi executado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Somente depois a autentica\u00e7\u00e3o falhou:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">DECRYPTION_FAILED<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tempo observado:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">3.97 segundos<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Em outra execu\u00e7\u00e3o:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">3.26 segundos<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Um ciphertext inv\u00e1lido conseguia, portanto, provocar v\u00e1rios segundos de processamento <strong>antes de ser rejeitado<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E o ciphertext tinha aproximadamente:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">103 bytes<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esse detalhe seria crucial posteriormente.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Pequeno input, grande trabalho<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Esse comportamento \u00e9 diferente do caso trivial:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">100 GB de input\u2192 muito consumo de recursos<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aqui temos:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">~103 bytes      \u2193alguns bytes controlam memoryCost      \u21934,194,304      \u2193Argon2id      \u2193grande consumo de recursos<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ou seja, existe uma rela\u00e7\u00e3o de <strong>amplifica\u00e7\u00e3o<\/strong>:SmallInput\u2192LargeResourceCost<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O custo n\u00e3o \u00e9 proporcional ao tamanho do ciphertext.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9 determinado por metadata control\u00e1vel antes da autentica\u00e7\u00e3o.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. Medindo mem\u00f3ria: o primeiro resultado enganou<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Primeiro utilizamos:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">process.memoryUsage()<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Antes:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">RSS: 40.16 MB<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Depois:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">RSS: 40.39 MB<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c0 primeira vista parecia que praticamente nenhuma mem\u00f3ria tinha sido utilizada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas havia um problema metodol\u00f3gico.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O Argon2id utiliza mem\u00f3ria nativa, e uma medi\u00e7\u00e3o realizada <strong>depois<\/strong> da opera\u00e7\u00e3o pode acontecer quando a aloca\u00e7\u00e3o relevante j\u00e1 foi liberada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ent\u00e3o mudamos o m\u00e9todo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Passamos a observar externamente o processo Node.js durante a execu\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em uma amostragem de uma opera\u00e7\u00e3o, observamos working set acima de <strong>1 GB<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas ainda quer\u00edamos entender o comportamento sob concorr\u00eancia.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. Duas opera\u00e7\u00f5es<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Executamos duas decripta\u00e7\u00f5es simultaneamente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ambas continham:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">memoryCost = 4,194,304<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Resultado:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Attempt 1:4.06 secondsDECRYPTION_FAILEDAttempt 2:4.07 secondsDECRYPTION_FAILED<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tempo total:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">4.07 seconds<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esse resultado era particularmente relevante.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se fossem completamente serializadas, esperar\u00edamos aproximadamente:T\u22484+4=8s<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas observamos:Ttotal\u200b\u2248T1\u200b\u2248T2\u200b<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E isso era consistente com processamento concorrente das opera\u00e7\u00f5es custosas.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. O n\u00famero que chamou nossa aten\u00e7\u00e3o<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Enquanto as duas opera\u00e7\u00f5es executavam, monitoramos o processo externamente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As amostras mostraram:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">WorkingSetMB     PeakWorkingSetMB1701.53          1701.536008.97          6008.977780.09          7780.092367.04          8232.07<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O maior <code>PeakWorkingSet<\/code> observado foi:8232.07&nbsp;MB<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">aproximadamente:8.0&nbsp;GiB<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E tudo isso havia sido provocado por <strong>dois ciphertexts pequenos que seriam posteriormente rejeitados<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nesse ponto interrompemos deliberadamente os testes de escala.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00e3o havia justificativa t\u00e9cnica para executar quatro, oito ou dezenas de opera\u00e7\u00f5es e arriscar derrubar a pr\u00f3pria m\u00e1quina.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">J\u00e1 t\u00ednhamos evid\u00eancia suficiente da amplifica\u00e7\u00e3o.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">20. Voltando ao Lean<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Agora t\u00ednhamos uma propriedade muito mais interessante para formalizar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Criamos:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">inductive KdfParameterStatus where  | withinBounds  | outOfBounds<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">E:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">inductive ProcessingDecision where  | rejectBeforeKdf  | executeKdf<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Modelamos:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">def decideKdfProcessing    (status : KdfParameterStatus) : ProcessingDecision :=  match status with  | KdfParameterStatus.outOfBounds =&gt;      ProcessingDecision.rejectBeforeKdf  | KdfParameterStatus.withinBounds =&gt;      ProcessingDecision.executeKdf<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">E provamos:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">theorem out_of_bounds_rejected_before_kdf :    decideKdfProcessing      KdfParameterStatus.outOfBounds      = ProcessingDecision.rejectBeforeKdf := by  rfl<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">assim como:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">theorem within_bounds_executes_kdf :    decideKdfProcessing      KdfParameterStatus.withinBounds      = ProcessingDecision.executeKdf := by  rfl<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Depois refinamos o estado.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. O ponto central da propriedade formal<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Criamos tr\u00eas est\u00e1gios:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">inductive ProcessingStage where  | beforeKdf  | afterKdfBeforeAuthentication  | authenticated<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">E ent\u00e3o provamos:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">theorem within_bounds_reaches_pre_authentication_stage :    stageAfterKdfDecision      (decideKdfProcessing KdfParameterStatus.withinBounds)      = ProcessingStage.afterKdfBeforeAuthentication := by  rfl<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A interpreta\u00e7\u00e3o \u00e9:WithinBounds\u21d2ExecuteKDF\u21d2AfterKDFBeforeAuthentication<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso captura exatamente a propriedade arquitetural que nos interessava.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. O que Lean provou \u2014 e o que ele N\u00c3O provou<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Essa talvez seja a parte mais importante deste artigo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lean <strong>n\u00e3o provou<\/strong>:Hiprax\/crypto&nbsp;e\u02ca&nbsp;vulnera\u02cavel<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tamb\u00e9m n\u00e3o provou:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">memoryCost = 4194304\u2192 8 GB de RAM<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nem provou a implementa\u00e7\u00e3o do Argon2id.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nem verificou automaticamente o TypeScript.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O que provamos foi uma propriedade do nosso <strong>modelo abstrato<\/strong>:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Quando os par\u00e2metros est\u00e3o dentro dos limites aceitos, o modelo permite que o KDF seja executado antes do est\u00e1gio de autentica\u00e7\u00e3o.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">A liga\u00e7\u00e3o com o sistema real veio de outra fonte:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>evid\u00eancia emp\u00edrica e an\u00e1lise de c\u00f3digo.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso produz uma estrutura muito mais intelectualmente honesta:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">            \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510            \u2502 Source analysis \u2502            \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                     \u2502                     \u25bc              comportamento                observado                     \u2502        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510        \u25bc                         \u25bc Experimentos                Modelo formal        \u2502                         \u2502        \u25bc                         \u25bctempo \/ mem\u00f3ria              propriedades        \u2502                         \u2502        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                     \u25bc              Security Finding<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nenhuma dessas camadas substitui a outra.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Elas se complementam.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">23. A causa arquitetural<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">O problema \u00e9 particularmente interessante porque n\u00e3o existe uma solu\u00e7\u00e3o trivial como:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cAutentique o header antes.\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Para verificar AES-GCM, precisamos da chave.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas:Authentication\u21d2Key<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">e:Key\u21d2KDF<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">enquanto:KDF\u21d2ParametersFromHeader<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Logo:Header\u2192KDF\u2192Key\u2192Authentication<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00e3o podemos simplesmente inverter para:Authentication\u2192KDF<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">porque ainda n\u00e3o temos a chave necess\u00e1ria para realizar aquela autentica\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso transforma o problema de um simples bug de implementa\u00e7\u00e3o em uma quest\u00e3o de <strong>design de protocolo e resource governance<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. A mitiga\u00e7\u00e3o correta \u00e9 limitar trabalho n\u00e3o confi\u00e1vel<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Uma defesa mais apropriada \u00e9 separar dois conceitos:MaximumSupportedKdfCost<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">de:MaximumAcceptedUntrustedDecryptCost<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esses limites n\u00e3o precisam ser iguais.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Uma biblioteca pode tecnicamente suportar um ciphertext com par\u00e2metros extremamente altos sem necessariamente permitir que qualquer aplica\u00e7\u00e3o processe esse custo vindo de uma origem n\u00e3o confi\u00e1vel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Controles poss\u00edveis incluem:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">KDF ceilings configur\u00e1veis        +limites espec\u00edficos para decrypt        +controle de concorr\u00eancia        +rate limiting        +isolamento de workers\/processos<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Isso transforma a quest\u00e3o em:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Quanto trabalho uma entrada ainda n\u00e3o autenticada tem permiss\u00e3o para provocar?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Essa pergunta \u00e9 aplic\u00e1vel muito al\u00e9m de criptografia.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. O que tornou o finding interessante<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">O finding n\u00e3o surgiu porque encontramos uma linha obviamente insegura como:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">eval(userInput)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ele surgiu de uma composi\u00e7\u00e3o de comportamentos individualmente razo\u00e1veis:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">1. O formato precisa armazenar par\u00e2metros KDF.<br>2. O decrypt precisa ler esses par\u00e2metros.<br>3. Par\u00e2metros inv\u00e1lidos precisam ter limites.<br>4. Par\u00e2metros v\u00e1lidos precisam chegar ao KDF.<br>5. O KDF precisa executar antes que exista uma chave.<br>6. A chave \u00e9 necess\u00e1ria para autenticar o ciphertext.<br>7. Opera\u00e7\u00f5es podem ocorrer concorrentemente.<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Separadamente, cada decis\u00e3o parece perfeitamente compreens\u00edvel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Compostas:1+2+3+4+5+6+7<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">produzem uma propriedade de seguran\u00e7a emergente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9 exatamente aqui que m\u00e9todos formais e racioc\u00ednio baseado em propriedades se tornam interessantes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">26. O papel dos contraexemplos<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Durante a investiga\u00e7\u00e3o, v\u00e1rias hip\u00f3teses nossas estavam erradas ou incompletas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por exemplo, poder\u00edamos pensar:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cSe o header n\u00e3o estiver autenticado, qualquer campo pode ser modificado.\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Falso.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O experimento com <code>memoryCost<\/code> mostrou um contraexemplo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O campo n\u00e3o estava diretamente protegido pelo AAD no modo legado, mas alter\u00e1-lo mudava a deriva\u00e7\u00e3o da chave e fazia o AES-GCM falhar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tamb\u00e9m investigamos altera\u00e7\u00f5es no KDF ID e na vers\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esses testes mostraram outros caminhos de parser, valida\u00e7\u00e3o e compatibilidade.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cada contraexemplo refinava o modelo mental.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso sugere uma metodologia poderosa:Hypothesis\u2192CounterexampleSearch\u2192Refinement<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">que \u00e9 extremamente pr\u00f3xima da maneira como trabalhamos com especifica\u00e7\u00f5es formais.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">27. Formal methods n\u00e3o significa necessariamente provar o sistema inteiro<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Existe uma percep\u00e7\u00e3o comum de que usar m\u00e9todos formais significa necessariamente:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">reescrever aplica\u00e7\u00e3o em linguagem formal        <br>\u2193modelar cada fun\u00e7\u00e3o        <br>\u2193provar centenas de teoremas        <br>\u2193s\u00f3 ent\u00e3o encontrar alguma coisa<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esse \u00e9 um uso poss\u00edvel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas n\u00e3o \u00e9 o \u00fanico.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neste trabalho utilizamos Lean como uma ferramenta de <strong>precis\u00e3o do racioc\u00ednio de seguran\u00e7a<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O processo foi:Implementation\u2192SecurityProperty\u2192MinimalModel\u2192Proof<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quando o modelo n\u00e3o correspondia ao comportamento observado, precis\u00e1vamos refin\u00e1-lo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E esse ciclo fazia surgir novas perguntas sobre a implementa\u00e7\u00e3o.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">28. O modelo formal funcionou como uma lupa<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A maior contribui\u00e7\u00e3o do Lean neste trabalho talvez n\u00e3o tenha sido o <code>No goals<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Foi nos obrigar a decidir exatamente o que cada conceito significava.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O que significa:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">tampered?<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O que significa:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">authenticated?<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O que significa:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">headerMatches?<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O que significa:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">withinBounds?<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">E principalmente:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">em que est\u00e1gio do processamento estamos?<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Em seguran\u00e7a, ambiguidades escondem bugs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Formaliza\u00e7\u00e3o for\u00e7a essas ambiguidades a aparecerem.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">29. A cadeia de evid\u00eancias<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Ao final, n\u00e3o depend\u00edamos de uma \u00fanica t\u00e9cnica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">T\u00ednhamos:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Camada<\/th><th>Evid\u00eancia<\/th><\/tr><\/thead><tbody><tr><td>Documenta\u00e7\u00e3o<\/td><td>Garantias e comportamento esperado<\/td><\/tr><tr><td>Source review<\/td><td>Ordem real de processamento<\/td><\/tr><tr><td>Unit tests existentes<\/td><td>Comportamentos conhecidos pelo projeto<\/td><\/tr><tr><td>Experimentos pr\u00f3prios<\/td><td>Reprodu\u00e7\u00e3o independente<\/td><\/tr><tr><td>Boundary analysis<\/td><td>Diferen\u00e7a entre rejeitado e permitido<\/td><\/tr><tr><td>Timing<\/td><td>~3\u20134 segundos por opera\u00e7\u00e3o<\/td><\/tr><tr><td>OS monitoring<\/td><td>Consumo de mem\u00f3ria nativa<\/td><\/tr><tr><td>Concurrency<\/td><td>Amplifica\u00e7\u00e3o observada<\/td><\/tr><tr><td>Lean<\/td><td>Propriedades do modelo mecanicamente provadas<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Isso \u00e9 muito mais forte do que dizer simplesmente:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cExecutei um script e consumiu muita RAM.\u201d<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">30. Responsible disclosure<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Depois de consolidar a evid\u00eancia, consultamos a pol\u00edtica de seguran\u00e7a do projeto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ela explicitamente solicita que problemas de seguran\u00e7a <strong>n\u00e3o sejam publicados em Issues, Pull Requests ou Discussions<\/strong>, preferindo canais privados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tamb\u00e9m encontramos uma distin\u00e7\u00e3o importante na pol\u00edtica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O projeto considera <strong>Denial of Service via large input<\/strong> fora do escopo \u2014 por exemplo, passar arquivos patologicamente grandes e esperar que a criptografia n\u00e3o consuma recursos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nosso cen\u00e1rio, entretanto, \u00e9 diferente:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Large-input DoS:gigabytes de input      \u2193gigabytes de trabalho<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">versus:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Nosso caso:~103 bytes      \u2193KDF cost metadata      \u2193gigabytes de mem\u00f3ria observada<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Por isso descrevemos o comportamento como:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Pre-Authentication Argon2id Resource Amplification via v1 Ciphertext Header<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">e n\u00e3o simplesmente como \u201clarge input DoS\u201d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O relat\u00f3rio foi submetido privadamente ao mantenedor em conformidade com a pol\u00edtica de responsible disclosure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>At\u00e9 que o processo de triagem seja conclu\u00eddo, a classifica\u00e7\u00e3o final pertence ao mantenedor.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">31. O finding<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A hip\u00f3tese submetida pode ser resumida como:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pre-Authentication Resource Exhaustion via Attacker-Controlled Argon2id Parameters<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A condi\u00e7\u00e3o estrutural \u00e9:SmallUnauthenticatedCiphertext\u2192AttackerInfluencedKDFParameters\u2192ExpensiveArgon2id\u2192AuthenticationFailure<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em nossos experimentos:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">memoryCost m\u00e1ximo aceito:4,194,304tempo por opera\u00e7\u00e3o:~3\u20134 segundosduas opera\u00e7\u00f5es concorrentes:~4.07 segundos totalPeakWorkingSet observado:~8.23 GBresultado final:DECRYPTION_FAILED<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A explorabilidade real depende do sistema consumidor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se somente dados confi\u00e1veis chegam ao decrypt, o risco \u00e9 muito menor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se uma aplica\u00e7\u00e3o permite:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Internet   \u2193ciphertext controlado   \u2193decrypt()<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">o cen\u00e1rio muda substancialmente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por isso submetemos a severidade como <strong>preliminar e deployment-dependent<\/strong>, em vez de apresentar uma classifica\u00e7\u00e3o absoluta.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">32. A principal li\u00e7\u00e3o<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">O resultado mais importante deste estudo n\u00e3o \u00e9:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cLean encontrou um DoS.\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Isso seria tecnicamente incorreto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A conclus\u00e3o mais interessante \u00e9:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>M\u00e9todos formais podem mudar a maneira como fazemos security research.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Em vez de procurar somente padr\u00f5es vulner\u00e1veis, podemos procurar viola\u00e7\u00f5es de propriedades.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A metodologia passa a ser:Understand\u2192Specify\u2192Experiment\u2192Formalize\u2192Challenge\u2192Refine\u200b<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O c\u00f3digo fornece a implementa\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Os experimentos fornecem evid\u00eancia concreta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Os contraexemplos quebram nossas hip\u00f3teses.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O monitoramento fornece impacto quantitativo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E o sistema formal nos obriga a dizer precisamente <strong>o que estamos afirmando<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">33. Seguran\u00e7a como problema matem\u00e1tico e experimental<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">H\u00e1 algo particularmente interessante nessa abordagem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Security research tradicionalmente mistura:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>engenharia reversa;<\/li>\n\n\n\n<li>conhecimento de sistemas;<\/li>\n\n\n\n<li>criatividade adversarial;<\/li>\n\n\n\n<li>experimenta\u00e7\u00e3o.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">M\u00e9todos formais adicionam uma nova dimens\u00e3o:precisa\u02dco&nbsp;lo\u02cagica<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A pergunta deixa de ser apenas:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cConsigo quebrar isso?\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">e passa a incluir:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cQual propriedade deveria impedir que eu quebrasse isso?\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Depois:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cEssa propriedade realmente vale?\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">E finalmente:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cSob quais hip\u00f3teses conseguimos prov\u00e1-la?\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Essa sequ\u00eancia aproxima seguran\u00e7a de \u00e1reas como matem\u00e1tica aplicada, verifica\u00e7\u00e3o de software e ci\u00eancia experimental.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">34. Conclus\u00e3o<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Come\u00e7amos com uma biblioteca criptogr\u00e1fica e uma propriedade simples:TamperedCiphertext\u21d2Reject<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adulteramos ciphertext.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Depois tag.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Depois chave.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Depois AAD.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Depois IV.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Investigamos headers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Descobrimos diferen\u00e7as entre modos atuais e legados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alteramos campos semanticamente relevantes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Seguimos o caminho da deriva\u00e7\u00e3o da chave.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Percebemos que o custo do KDF era determinado antes da autentica\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Testamos os limites.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Medimos tempo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Medimos mem\u00f3ria.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Testamos concorr\u00eancia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E formalizamos a propriedade estrutural em Lean.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O caminho completo foi:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Cryptographic library        <br>\u2193Security claims        <br>\u2193Security properties        <br>\u2193Source-code analysis        <br>\u2193Concrete experiments        <br>\u2193Counterexamples        <br>\u2193Model refinement        <br>\u2193Formal specification        <br>\u2193Lean proofs        <br>\u2193Resource measurements        <br>\u2193Candidate security finding        <br>\u2193Responsible disclosure<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Talvez essa seja a melhor demonstra\u00e7\u00e3o do valor de m\u00e9todos formais aplicados \u00e0 seguran\u00e7a:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>eles n\u00e3o substituem o pesquisador, o teste ou a an\u00e1lise do c\u00f3digo.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eles tornam nossas afirma\u00e7\u00f5es mais precisas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E, quando combinamos precis\u00e3o matem\u00e1tica com experimenta\u00e7\u00e3o adversarial, come\u00e7amos a enxergar propriedades do sistema que uma leitura puramente sint\u00e1tica do c\u00f3digo dificilmente revelaria.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Nota sobre disclosure<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Este artigo descreve a <strong>metodologia de pesquisa e os resultados experimentais obtidos durante a an\u00e1lise<\/strong>. O comportamento foi reportado privadamente ao mantenedor para triagem de seguran\u00e7a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A pol\u00edtica do projeto prev\u00ea reconhecimento inicial em at\u00e9 72 horas, decis\u00e3o de triagem\/severidade posteriormente e divulga\u00e7\u00e3o p\u00fablica coordenada ap\u00f3s eventual corre\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At\u00e9 a conclus\u00e3o desse processo, termos como <em>candidate finding<\/em> e <em>potential security issue<\/em> s\u00e3o deliberados: <strong>evid\u00eancia t\u00e9cnica reproduz\u00edvel n\u00e3o deve ser confundida com uma classifica\u00e7\u00e3o final unilateral de vulnerabilidade.<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introdu\u00e7\u00e3o M\u00e9todos formais costumam aparecer em discuss\u00f5es de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":315,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[37,17,29,13,10],"tags":[],"class_list":["post-314","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-criptografia","category-fikresekhel","category-pesquisa","category-research","category-secure-coding"],"_links":{"self":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts\/314","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/comments?post=314"}],"version-history":[{"count":1,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts\/314\/revisions"}],"predecessor-version":[{"id":316,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts\/314\/revisions\/316"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/media\/315"}],"wp:attachment":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/media?parent=314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/categories?post=314"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/tags?post=314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}