De Escritorio de Adobe Servicio no estaba mirando a su /etc/passwd. Apple del sistema de biblioteca.
Apple del sistema de biblioteca, quería saber su nombre de usuario para que pueda encontrar su directorio de inicio. Entonces decidió que la mejor manera de averiguar su nombre de usuario fue a buscar en /etc/passwd
. De Escritorio de Adobe Servicio sólo quería saber la ruta de acceso a su directorio home, y (correctamente) que se utiliza el CoreFoundation marco para ello. Es por eso que la llamada aparece en Adobe proceso.
Detalles
En tu captura de pantalla, la Llamada de la entrada dice algo como _fsi_get_user
. Este es el símbolo de una subrutina privada en uno de macOS del sistema de bibliotecas, libsystem_info.dylib
, que se encuentra en /usr/lib/system
.
El público el código fuente de la _fsi_get_user
función revela la siguiente lógica:
if (geteuid() == 0)
{
// […]
}
else
{
f = fopen(_PATH_PASSWD, "r");
_fsi_get_validation(si, VALIDATION_PASSWD, _PATH_PASSWD, f, &va, &vb);
fmt = 1;
}
Mirando el descompilar el código en libsystem_info.dylib
(por ejemplo, el uso de la Tolva Desensamblador) confirma que _PATH_PASSWD
es de hecho el nombre de archivo /etc/passwd
. (El código fuente más abajo en file_module.c
también explica por qué hay una llamada a fstat
inmediatamente después de la fopen
: la aplicación de la _fsi_get_validation
hace que la figura fuera de la última fecha de modificación de su /etc/passwd
.)
En otras palabras: Adobe no estaba buscando en su archivo passwd; Apple del sistema de biblioteca.
Conectar los puntos
Hay muchas posibles pilas de llamadas que pueden conectarse de Escritorio de Adobe de Servicio el código de la _fsi_get_user
función. Un poco de análisis estático sugiere el candidato más plausible sería NSHomeDirectory
, una clase de utilidad en Foundation.framework
.
Busca en el Escritorio de Adobe del Servicio binario revela que, de hecho, se llama [NSHomeDirectory UTF8String]
:
*100032ac4 call imp___stubs__NSHomeDirectory
*100032ac9 mov rsi, qword [0x10008a178] ; "UTF8String"
*100032ad0 mov rdi, rax
*100032ad3 call qword [_objc_msgSend_100088350]
La implementación de Apple NSHomeDirectory
nos conducirá a /etc/passwd
con bastante rapidez. Mi conjetura más probable de la cadena de llamadas a la función sería:
De Escritorio de Adobe Servicio → [NSHomeDirectory UTF8String]
( Foundation.framework
) → NSHomeDirectoryForUser
→ CFCopyHomeDirectoryURLForUser
( CoreFoundation.framework
) → _CFCopyHomeDirURLForUser
→ getpwuid
( libsystem_info.dylib
, re-exportados a través de libSystem.B.dylib
) → si_user_byuid
(esto es que Apple decide en tiempo de ejecución de la fuente que se va a utilizar. Por ejemplo, si el ID de usuario es de entre 1 y 499, su /etc/passwd
será consultado en lugar de los Servicios de Directorio.) → file_user_byuid
→ _fsi_get_user
.
Para estar más seguro, he analizado el binario de Escritorio de Adobe Servicio y como era de esperar, no contiene una sola referencia a /etc/passwd
. (No he comprobado si es o no de Escritorio de Adobe Servicio de otros sombra de las cosas, sin embargo.)
Todo el análisis hubiera sido un poco más fácil si hubiera hecho clic en una de las entradas antes de que se creó la captura de pantalla. Su aplicación, a continuación, han demostrado el correspondiente seguimiento de la pila en la parte inferior de la esquina derecha (es la de las líneas, donde dice: Seguimiento de la Pila). Pero bueno, yo tenía un montón de diversión de averiguar lo que ocurría, y he aprendido mucho de esa manera!
Verificación
Para confirmar que mi análisis es correcto, puede que desee haga clic en uno de los /etc/passwd
entradas en sus Instrumentos de aplicación y encontrar los términos NSHomeDirectory
y file_user_byuid
en algún lugar en el seguimiento de la pila.