Skip to content

fix: zera os alertas de code scanning (CodeQL + Semgrep)#29

Merged
ram0ng1 merged 1 commit into
mainfrom
claude/sec-codescanning
Jun 12, 2026
Merged

fix: zera os alertas de code scanning (CodeQL + Semgrep)#29
ram0ng1 merged 1 commit into
mainfrom
claude/sec-codescanning

Conversation

@ram0ng1

@ram0ng1 ram0ng1 commented Jun 12, 2026

Copy link
Copy Markdown
Owner

O que muda

Zera os 12 alertas abertos de Code scanning do repositório.

CodeQL high ×2 (js/empty-password-in-configuration-file, ci.yml:93 e :134) — correção real: os serviços MySQL/MariaDB da CI subiam com senha vazia (*_ALLOW_EMPTY_PASSWORD). Agora usam a senha de teste root nos services, nas strings de conexão BACKUP_TEST_* (inclusive no job all-directions) e no health-check do mysqladmin.

Semgrep ×10 — todos verificados um a um e são falsos positivos; cada linha ganhou supressão nosemgrep pontual com a justificativa inline:

  • flarum-v2-server-side-fetch ×6: file_get_contents de arquivos locais (upload.meta.json, manifest NDJSON, composer.lock, job.json e o arquivo de estado do próprio teste E2E). Nenhuma URL, nenhum input de usuário no caminho.
  • flarum-v2-path-traversal-naive-filter (ImportJob:774): o resolver rejeita nomes com ../NUL/backslash (não faz o strip ingênuo que a regra mira) e, vinte linhas abaixo, ainda canonicaliza o pai com realpath() e re-checa o prefixo do root permitido, exatamente o que a mensagem da regra pede.
  • flarum-v2-capsule-manager ×2: harness de teste standalone que monta o Capsule de propósito (não há Flarum bootado em testes unitários).

Verificação

php -l em todos os arquivos tocados e semgrep local com as regras Flarum-v2: 0 achados após o PR. Com o merge, o push em main re-roda os scanners e os alertas fecham sozinhos na aba Security.


Generated by Claude Code

Os serviços MySQL/MariaDB da CI deixam de subir com senha vazia
(CodeQL high js/empty-password-in-configuration-file): root ganha a
senha de teste 'root' nos services, nas strings de conexão e no
health-check do mysqladmin.

Os 10 achados do Semgrep eram falsos positivos verificados um a um:
file_get_contents de arquivos locais (meta de upload, manifest,
composer.lock e estado de job) sem nenhuma URL de input, o resolver de
destino do import que REJEITA '..' e ainda confina o caminho com
realpath logo abaixo, e código de harness de teste que monta o Capsule
de propósito. Cada ponto ganhou supressão nosemgrep pontual com a
justificativa na própria linha; a varredura local fecha em zero.
Comment thread src/Job/ImportJob.php
{
$name = ltrim($name, '/');
if (str_contains($name, '..') || str_contains($name, "\0") || str_contains($name, '\\')) {
if (str_contains($name, '..') || str_contains($name, "\0") || str_contains($name, '\\')) { /* rejeita (não remove) e o destino ainda passa pela contenção com realpath abaixo; nosemgrep: flarum-v2-path-traversal-naive-filter */
$path = $dir.DIRECTORY_SEPARATOR.'upload.meta.json';
if (! is_file($path)) return [];
$raw = @file_get_contents($path);
$raw = @file_get_contents($path); /* leitura de arquivo local, sem URL de input; nosemgrep: flarum-v2-server-side-fetch */
$path = $dir.DIRECTORY_SEPARATOR.'upload.meta.json';
if (! is_file($path)) return [];
$raw = @file_get_contents($path);
$raw = @file_get_contents($path); /* leitura de arquivo local, sem URL de input; nosemgrep: flarum-v2-server-side-fetch */
Comment thread src/Job/ExportJob.php
private function loadManifest(string $path): array
{
$raw = @file_get_contents($path);
$raw = @file_get_contents($path); /* leitura de arquivo local, sem URL de input; nosemgrep: flarum-v2-server-side-fetch */
Comment thread src/Job/ExportJob.php
$composer = $this->appPaths->base.DIRECTORY_SEPARATOR.'composer.lock';
if (is_file($composer)) {
$data = json_decode((string) file_get_contents($composer), true);
$data = json_decode((string) file_get_contents($composer), true); /* leitura de arquivo local, sem URL de input; nosemgrep: flarum-v2-server-side-fetch */
Comment thread src/Job/JobState.php
throw new RuntimeException('Job state file not found: '.$file);
}
$raw = @file_get_contents($file);
$raw = @file_get_contents($file); /* leitura de arquivo local, sem URL de input; nosemgrep: flarum-v2-server-side-fetch */
use Flarum\Foundation\Paths;
use Illuminate\Container\Container;
use Illuminate\Database\Capsule\Manager as Capsule;
use Illuminate\Database\Capsule\Manager as Capsule; /* harness de teste standalone, sem boot do Flarum; nosemgrep: flarum-v2-capsule-manager */
$this->assertStringNotContainsString(
$privateKey,
(string) file_get_contents($jobStateFile),
(string) file_get_contents($jobStateFile), /* arquivo local do próprio teste; nosemgrep: flarum-v2-server-side-fetch */
$this->assertStringNotContainsString(
$privateKey,
(string) file_get_contents($jobStateFile),
(string) file_get_contents($jobStateFile), /* arquivo local do próprio teste; nosemgrep: flarum-v2-server-side-fetch */
Comment thread tests/Support/Engines.php

use Illuminate\Container\Container;
use Illuminate\Database\Capsule\Manager as Capsule;
use Illuminate\Database\Capsule\Manager as Capsule; /* harness de teste standalone, sem boot do Flarum; nosemgrep: flarum-v2-capsule-manager */
@ram0ng1 ram0ng1 added seguranca Correção ou reforço de segurança correcao Correção de erro (patch) labels Jun 12, 2026 — with Claude
@ram0ng1 ram0ng1 merged commit 3dd7754 into main Jun 12, 2026
21 of 22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

correcao Correção de erro (patch) seguranca Correção ou reforço de segurança

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants