Me pregunto cómo el llavero identifica las aplicaciones. Sospecho que esto se basa en la firma del código, pero los experimentos no son realmente consistentes con esto:
Funciona para ejecutables que no están firmados en absoluto:
codesign -dv /Library/Frameworks/R.framework/Resources/bin/exec/R
# /Library/Frameworks/R.framework/Resources/bin/exec/R: code object is not signed at all
Pero el proceso R se agrega a la ACL de este secreto, y puede consultarlo alegremente ...
Tampoco hay nada en los atributos extendidos del ejecutable:
xattr -l /usr/bin/security
#
Si cambio el archivo en sí, aún funciona:
cp /usr/bin/security foobar
echo "\nharmless" >> foobar
./foobar find-generic-password -a 'gaborcsardi' -s foobar -g
# keychain: "/Users/gaborcsardi/Library/Keychains/login.keychain"
# class: "genp"
# attributes:
# 0x00000007 <blob>="foobar"
# 0x00000008 <blob>=<NULL>
# "acct"<blob>="gaborcsardi"
# ...
# password: "secret"
Pero entonces, ¿cómo funciona? Más específicamente, ¿cómo sabe el llavero que la consulta de contraseña proviene de la aplicación security
, que específicamente permití el acceso a esta entrada?