7 votos

¿Ejecutar comando de shell descargado sin ser root?

Mi teléfono es un Galaxy S3, no rooteado. Tengo instalados "ES File Explorer" y "Terminal Emulator".

Descargué una versión de Android de 'wget', con la intención de ejecutarlo desde la aplicación Terminal Emulator. El archivo actualmente existe en /storage/sdcard0/Download (que es una partición interna, no una tarjeta SD física) como:

-rw-rw-r-- root sdcard_rw 241974 2016-03-11 wget

./wget da Permiso denegado. chmod o+x wget da "Modo incorrecto"; esto aparentemente es porque el chmod de Android solo acepta dígitos octales; chmod 665 wget da "Operación no permitida". Puedo copiar el archivo con "cp", por lo que el sistema de archivos es escribible.

Otras preguntas y respuestas aquí dan varias posibles razones por las que chmod falla en Android. Una es tarjetas SD formateadas con FAT que no admiten bits de permiso; pero como mencioné, esto no es en realidad una tarjeta SD. Otra es el sistema de archivos montado con "noexec". Mi conocimiento de Android/Linux es demasiado limitado para verificar tales cosas.

¿Android me está bloqueando la ejecución de wget por diseño? ¿Hay alguna manera de ejecutarlo sin rootear mi teléfono?

0 votos

Utilice el comando sh antes de invocar su script. Vea aquí: Permisos de scripts de Shell para aficionados a Android

1 votos

@Chungzuwalla: Si quieres el comando wget sin tener que rootear, es posible que te interese esta versión de busybox de wget.

0 votos

Gracias @AaronGillion, intenté usar sh pero como wget es un binario, solo muestra un error de sintaxis. Parece que lo que @MatijaNalis escribió abajo sobre esto es correcto.

6voto

Matthew Read Puntos 35808

Sí, esto está diseñado así. No se pueden ejecutar binarios desde la tarjeta SD sin privilegios de sistema o superusuario (y volver a montarla sin la opción noexec) porque de lo contrario las aplicaciones podrían simplemente descargar y ejecutar código malicioso a voluntad. En versiones antiguas de Android la tarjeta SD también no tenía permisos emulados por lo que chmod naturalmente fallaría.

Algunos dispositivos/versiones antiguas de Android podrían permitir la ejecución desde /data/local/tmp/, por lo que podrías intentar ponerlo allí. De lo contrario, probablemente necesitarás acceso de superusuario.

0 votos

¡Gracias! Había esperado que fuera el sistema de permisos de la aplicación el que controlara lo que una aplicación podía hacer, por lo que descargar y ejecutar código estaría bien si no requiriera ningún privilegio más allá de lo que la aplicación ya tiene. De todas formas, no tengo /local en absoluto, o al menos no puedo verlo. Creo que la estructura de los sistemas de archivos de UNIX seguirá siendo un misterio para mí durante mucho tiempo.

0 votos

Las aplicaciones pueden ejecutar sus propios binarios, aunque. Como instalaste la aplicación de terminal, cualquier binario de esta aplicación puede ser ejecutado. Por lo tanto, copia el binario en la carpeta de la aplicación de la terminal y podrás ejecutarlo desde allí. Lo intenté, funciona.

0 votos

@TJJ ¡Eso es inteligente!

5voto

Android, al igual que Linux, impide que cualquier usuario que no sea root cambie los bits de permiso de cualquier archivo que no sea propiedad de dicho usuario. Dicho esto, chmod es ineficaz a menos que tengas privilegios de root.

Por cierto, incluso si tuvieras dichos privilegios, no podrías cambiar los permisos mientras la ruta de destino sea /storage/sdcard0 o /storage/emulated/0. Esto depende de una política de seguridad que se implementa en forma del sistema de archivos FUSE, y se puede evitar moviéndose a /data/media/0 o /data/media/emulated/0, y cambiando los permisos del archivo desde esta posición. Ten en cuenta que este procedimiento te permitirá ejecutar un script solo si lo lanzas desde una de las ubicaciones mencionadas anteriormente.

Por último, cabe mencionar que la versión de Android de chmod no soporta la edición simbólica de las banderas (+rwx y así sucesivamente), por lo que te verás obligado a editarlos a través de sus valores octales correspondientes. También necesitarás privilegios de root para poder acceder a /data/media. Intentar cd a dicho directorio usando privilegios de usuario resulta en un error de Permiso denegado.

0 votos

Creo que aquí es donde me confundo mucho. Así que cuando descargué el archivo binario de wget (usando algún navegador, no recuerdo cuál ahora) se guardó como propiedad de root. Si lo copio con cp en el Emulador de Terminal, la copia también es propiedad de root. Puedo eliminar la copia. Pero la terminal del Emulador de Terminal no es una terminal de root. Hay muchas cosas sobre esto que me confunden. Pero eso es otra pregunta completamente diferente...

0 votos

@Chungzuwalla Copiar un archivo es una operación que por lo general está permitida, siempre y cuando el archivo a copiar no esté bloqueado (como el /etc/shadow en Linux). Sin embargo, cambiar los permisos es una operación peligrosa, ya que, si es realizada por algún usuario no confiable, puede prohibir el acceso a casi cualquier archivo (chmod 000).

0voto

Matija Nalis Puntos 109
  • primero, para hacer que el archivo sea ejecutable, debes hacer chmod 775 wget (y no 665)
  • pero solo puedes cambiar los modos del archivo si eres su propietario (o root). En tu caso, el propietario es root (y el grupo sdcard_rw, como indica tu ls -l), por lo que solo root puede cambiar los permisos. Como no eres root (puedes verificarlo con el comando id, pero como dices que no tienes un dispositivo rooteado, no puedes usar su para convertirte en root), no puedes cambiar sus permisos.
  • Además, los modos solo se pueden cambiar si el sistema de archivos que contiene el archivo admite permisos UN*X. Tu /storage/sdcard0/Download probablemente sea FAT, que no lo admite (puedes verificar el tipo de sistema de archivos con cat /proc/mounts)

Dicho todo esto, si el archivo fuera un script de shell, podrías ejecutarlo incluso con el modo x faltante con sh /storage/sdcard0/Download/script.

Pero si es un binario ELF (como es el caso con tu wget), probablemente estés fuera de suerte en Android (en un sistema de GNU/Linux de escritorio, puedes ejecutar binarios ELF indirectamente a través del enlazador dinámico /lib64/ld-linux-x86-64.so.2 /mnt/Download/wget, pero no creo que Android permita lo mismo con su /system/bin/linker - aunque podría estar equivocado en ese aspecto)

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X