#[\SensitiveParameter] values leak through joinpoint frames in stack traces
Los mantenedores suelen responder en 1 día
Ya se ha fusionado un pull request relacionado.
- #803 de @lisachenko — fusionado
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 18/100
Línea de trabajo
Start with the joinpoint __invoke() methods named in the issue: DynamicTraitAliasMethodInvocation, StaticTraitAliasMethodInvocation, ReflectionFunctionInvocation and ReflectionConstructorInvocation, plus the ClassFieldAccess read and write values. Reproduce the leaked frame with zend.exception_ignore_args=0 and check Throwable::getTrace(). The work is already claimed by open pull request #803, so coordinate there before starting.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
What happens
Proxies keep #[\SensitiveParameter], so the proxy frame and the original method frame are redacted correctly. The joinpoint frames between them, though, receive the arguments as a plain array, and Throwable::getTrace() exposes the secret there:
public function fail(string $user, #[\SensitiveParameter] string $password): never { throw new RuntimeException('boom'); }
#0 Demo\Auth->failOriginalAlias ["bob","SensitiveParameterValue"]
#1 ReflectionMethod->invokeArgs ["Demo\\Auth",["bob","s3cr3t"]] <- leaked
#2 Go\Aop\Framework\DynamicTraitAliasMethodInvocation->proceed []
#3 Demo\LogAspect->around [...]
#4 Go\Aop\Framework\AroundInterceptor->invoke [...]
#5 Go\Aop\Framework\DynamicTraitAliasMethodInvocation->proceed []
#6 Go\Aop\Framework\DynamicTraitAliasMethodInvocation->__invoke ["Demo\\Auth",["bob","s3cr3t"]] <- leaked
#7 Demo\Auth->fail ["bob","SensitiveParameterValue"]
(reproduced with zend.exception_ignore_args=0)
The string form of the trace prints Array, so the usual log line is safe. Error trackers that serialize getTrace() (Sentry and similar) capture the value. PHP 8.6 puts more weight on argument display (error_include_args and more #[\SensitiveParameter] markings in core). This leak exists on all supported versions.
Proposed fix
- Mark the
$arguments/$variadicArgumentsparameters of every joinpoint__invoke()with#[\SensitiveParameter]:DynamicTraitAliasMethodInvocation,StaticTraitAliasMethodInvocation,ReflectionFunctionInvocation,ReflectionConstructorInvocation, and theClassFieldAccessread/write values. The parameter values stay visible in the proxy frame, where#[\SensitiveParameter]is applied per parameter. There is no runtime cost on the hot path (check withcomposer test:performance). - The
ReflectionMethod::invokeArgs()frame (#1) can't carry the attribute because the method is internal. Fixing that frame means calling the original body through a closure whose parameter is marked, for example withClosure::call(). That's a separate trade-off: the class docblock explains whyinvokeArgs()was chosen (speed, by-reference arguments).
Part of #789.
- Lenguaje dominante
- PHP
- Estrellas
- 1.7k
- Forks
- 166
- Merge medio
- 1 d 1 h
- PR fusionados (30 d)
- 43
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de goaop/framework
-
Bug
Dificultad 4/5 1-2 días Aptitud para principiantes 56/100
Los mantenedores suelen responder en 1 día
-
Bug
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
Los mantenedores suelen responder en 1 día
-
Enhancement Performance
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
Los mantenedores suelen responder en 1 día
-
Enhancement Performance To Be Discussed
Dificultad 5/5 Más de una semana Aptitud para principiantes 28/100
goaop/framework#814 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Enhancement PHP-8.6
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
Los mantenedores suelen responder en 1 día
Todos los issues de goaop/framework
Issues similares
-
IDS: enable Suricata 8 Hyperscan MPM cache (detect.sgh-mpm-caching) in suricata.yaml templateAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 69/100
opnsense/core#11171 · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
getgrav/grav-plugin-form#664 ·
-
claude
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
sprain/sprainocchio#26 ·
-
sync-en
Dificultad 1/5 1-3 horas Aptitud para principiantes 84/100
Los mantenedores suelen responder en 1 día
-
sync-en
Dificultad 1/5 1-3 horas Aptitud para principiantes 82/100
Los mantenedores suelen responder en 1 día