fsockopen()/stream_socket_client() accept TCP ports above 65535, which wrap to another port
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 72/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Ambito
- backend, networking
Direzione di ricerca
Inizia leggendo parse_ip_address_ex() in main/streams/xp_socket.c, soprattutto le chiamate a atoi() menzionate nell’issue, e controlla come vengono convalidate le porte socket altrove, incluso parse_url(). Aggiungi un test di regressione per stream_socket_client() e fsockopen() con una porta superiore a 65535. Il lavoro è completato quando entrambi rifiutano la porta non valida invece di connettersi alla porta risultante dall’avvolgimento.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Description
A TCP port number above 65535 is not rejected by fsockopen() or stream_socket_client(): it wraps modulo 65536 and the connection goes to a different port. parse_ip_address_ex() in main/streams/xp_socket.c reads the port with atoi() and stores it without a range check.
The following code:
<?php
$srv = stream_socket_server("tcp://127.0.0.1:0");
$name = stream_socket_get_name($srv, false);
$port = (int)substr($name, strrpos($name, ':') + 1);
$c = stream_socket_client("tcp://127.0.0.1:" . ($port + 65536));
echo "asked for ", $port + 65536, ", connected to ", stream_socket_get_name($c, true), "\n";
$c2 = fsockopen("127.0.0.1", $port + 65536);
echo "fsockopen connected to ", stream_socket_get_name($c2, true), "\n";
Resulted in this output:
asked for 99735, connected to 127.0.0.1:34199
fsockopen connected to 127.0.0.1:34199
But I expected this output instead: both calls fail with an invalid port error, since 99735 is not a valid TCP port (parse_url() already rejects such ports).
Reproduced on 8.2.34-dev (512c04e39f) and 8.4.28-dev; master has the same atoi() calls (xp_socket.c lines 654 and 664).
This issue was found by an LLM-Enhanced Static Analysis Engine and verified manually.
PHP Version
PHP 8.4.28-dev, PHP 8.2.34-dev
Operating System
Linux (Ubuntu 20.04, x86_64)
- Lingua principale
- C
- Stelle
- 40.7k
- Fork
- 8.3k
- Merge medio
- 2g 16h
- PR unite (30g)
- 151
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di php/php-src
-
sapi/fpm/tests/tester.inc can send SIGUSR2 to pid 0, killing run-tests.phpForse già presa Una pull request collegata a questa issue è aperta o già unita. ApertaBug Status: Needs Triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
zend_set_local_var() overwrites existing compiled variable (CV) zval without calling zval_ptr_dtor()Forse già presa Una pull request collegata a questa issue è aperta o già unita. ApertaBug Status: Needs Triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno
-
Case-insensitive substr_compare, ksort, krsort are still locale-dependentForse già presa @lazerg l’ha presa 3 giorni fa. ApertaBug Extension: standard Status: Verified
Difficoltà 2/5 1-3 ore Idoneità per principianti 73/100
php/php-src#24552 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
master: part of the mbstring bailout fix got lost in a mergeForse già presa @lazerg l’ha presa 4 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Bug Status: Needs Triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 64/100
I maintainer di solito rispondono entro 1 giorno
Issue simili
-
Add `CPC_TAKE_TILL_CHARS`Apertadifficulty: easy
Difficoltà 2/5 1-3 ore Idoneità per principianti 64/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
-
performance solver
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
ChefKissInc/Inferno#319 ·
-
llvm-tools
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100
llvm/llvm-project#235522 ·
I maintainer di solito rispondono entro 1 giorno