Uma regra pode estar correta no papel e mesmo assim nunca disparar, e o culpado de sempre é a caixa: maiúsculas e minúsculas. Os matchers (os comparadores) do XC são precisos sobre quais partes da requisição são comparadas como case-insensitive (sem diferenciar maiúsculas de minúsculas) e quais não são, e o match de valor exato é literal por padrão.
O que é case-insensitive e o que não é
Pelo schema, as regras são bem definidas:
Os nomes dos headers HTTP (os cabeçalhos) são case-insensitive. Accept-Encoding e accept-encoding são o mesmo header. Isso segue o padrão HTTP.
Já os valores de header são case-sensitive. Um matcher de header cujo exact_values contém gzip não vai dar match num valor de header GZIP.
As chaves dos parâmetros de query são case-sensitive. Os nomes de cookie são case-sensitive. Os nomes de argumento (caminhos JSON dentro do body) são case-sensitive.
Ou seja, o nome de um header é tolerante, mas quase todo o resto que você compara é exato.
Comparações exatas são literais
Uma lista exact_values compara a entrada byte a byte. /Admin não dá match com /admin. Não existe conversão implícita de caixa, nem remoção de espaços, nem decodificação de URL. Se o tráfego real pode variar em caixa ou em codificação, um matcher exato preso a uma única grafia vai deixar passar as variantes.
É aqui que o explicador marca um matcher como case-sensitive: quando uma regra usa valores exatos sem nenhum transformer que normalize a caixa, ele está avisando que a grafia e a caixa precisam bater exatamente.
Transformers
Os transformers são a ferramenta para domar isso. Um matcher pode ter uma lista ordenada de transformers, aplicados à entrada antes da comparação. Entre os disponíveis estão:
LOWER_CASE e UPPER_CASE uniformizam a caixa, para você dar match independentemente de como o cliente usou maiúsculas e minúsculas no valor. URL_DECODE decodifica o percent-encoding (a codificação com o sinal de porcentagem, conforme a 1738). BASE64_DECODE decodifica . NORMALIZE_PATH reduz /a/b/../c a /a/c. REMOVE_WHITESPACE remove os espaços. TRIM, TRIM_LEFT e TRIM_RIGHT removem os espaços das pontas.
path:
exact_values: ["/admin"]
transformers: ["LOWER_CASE"]
Com LOWER_CASE aplicado, esse matcher dá match tanto em /admin quanto em /Admin e /ADMIN, porque a entrada é convertida para minúsculas antes da comparação. Os transformers seguem uma ordem: o índice 0 roda primeiro, depois o índice 1, e assim por diante, o que faz diferença quando você combina, por exemplo, URL_DECODE e depois LOWER_CASE.
Por que isso importa nas regras de segurança
Brechas de caixa e de codificação não são cosméticas. Uma regra de deny feita para bloquear /admin que não usa LOWER_CASE pode ser contornada com facilidade usando /Admin. Uma regra pensada contra evasão normaliza primeiro (decodifica, normaliza o caminho, uniformiza a caixa) e só depois compara. Quando você audita uma política, a presença ou a ausência de transformers num matcher mostra se ela resiste a um cliente que varia a caixa ou a codificação de propósito. O explicador mostra a lista de transformers de cada matcher e sinaliza os matchers exatos que não uniformizam a caixa.
O transformer decide o que conta como "igual"
Um matcher compara a requisição com um valor, e os transformers decidem em que forma os dois lados estão antes dessa comparação. Erre o transformer e a comparação fica tecnicamente correta, mas sobre dados que já não se parecem com o que chegou.
É aí que mora a evasão. Um caminho comparado sem normalização trata /Admin, /admin e uma grafia com percent-encoding como três strings diferentes; então um DENY em uma delas deixa as outras acessíveis, e a regra parece certa na revisão. Aplicar os mesmos transformers que o servidor de origem aplica é o que faz a decisão da política corresponder à requisição que a origem vai de fato ver.
A normalização diferente entre a política e a origem é a brecha, e ela é invisível olhando de qualquer um dos lados sozinho: a política aplica a regra dela corretamente, a origem atende a requisição corretamente, e as duas discordam sobre o que a requisição dizia.