Eu estava lendo a famosa lenda do Unix Recovery , e me ocorreu pensar:
Se eu tivesse um shell do BusyBox aberto e o próprio binário do BusyBox fosse excluído, ainda seria possível usar todos os comandos incluídos no binário do BusyBox?
Claramente, eu não seria capaz de usar a versão BB desses comandos de outro shell em execução, como bash
, uma vez que o próprio arquivo BusyBox não estaria disponível para bash
abrir e executar. Mas, a partir da instância em execução do BusyBox, parece-me que poderia haver dois métodos pelos quais o BB executaria um comando:
- Ele poderia bifurcar e executar uma nova instância do BusyBox, chamando-a usando o nome apropriado - e lendo o arquivo BusyBox do disco para fazer isso.
- Ele poderia bifurcar e executar alguma lógica interna para executar o comando especificado (por exemplo, executando-o como uma chamada de função).
Se (1) for o modo como o BusyBox funciona, eu esperaria que determinados comandos fornecidos pelo BusyBox fiquem indisponíveis a partir de uma instância em execução do BB após a exclusão do binário do BB.
Se (2) é assim que funciona, o BusyBox pode ser usado até para recuperar um sistema em que o próprio BB foi excluído - desde que ainda exista uma instância em execução do BusyBox acessível.
Isso está documentado em algum lugar? Caso contrário, existe uma maneira de testá-lo com segurança?
fonte
is there a way to safely test it?
Baixe o x86 genéricoopenwrt
imagem e anexar a imagem para uma nova máquina VirtualBoxPATH
desativação? Ele assume um valor padrão dePATH
?Respostas:
Por padrão, o BusyBox não faz nada de especial em relação aos applets incorporados (os comandos listados
busybox --help
).No entanto, se as opções
FEATURE_SH_STANDALONE
eFEATURE_PREFER_APPLETS
estiverem ativadas no momento da compilação, quando o BusyBox executar um comando que é um nome conhecido de applet, ele não fará aPATH
pesquisa normal , mas executará seus applets internos por meio de um atalho:chgrp
,chmod
,chown
,cksum
,cp
,cut
,dd
,dos2unix
,env
,fold
,hd
,head
,hexdump
,ln
,ls
,md5sum
,mkfifo
,mknod
,sha1sum
,sha256sum
,sha3sum
,sha512sum
,sort
,tac
,unix2dos
.[[
,[
,basename
,cat
,dirname
,echo
,false
,fsync
,length
,logname
,mkdir
,printenv
,printf
,pwd
,rm
,rmdir
,seq
,sync
,test
,true
,usleep
,whoami
,yes
.fork
eexecve
), mas, em vez de fazer umaPATH
pesquisa, o BusyBox executa/proc/self/exe
, se disponível (o que normalmente acontece no Linux), e um caminho definido no momento da compilação.Isso está documentado com mais detalhes em
docs/nofork_noexec.txt
. As declarações do applet estão noinclude/applets.src.h
código-fonte.A maioria das configurações padrão desativa esses recursos, para que o BusyBox execute comandos externos como qualquer outro shell. O Debian ativa esses recursos nos pacotes its
busybox
ebusybox-static
Portanto, se você tiver um executável do BusyBox compilado com
FEATURE_SH_STANDALONE
eFEATURE_PREFER_APPLETS
, poderá executar todos os comandos do BusyBox a partir de um shell do BusyBox, mesmo que o executável seja excluído (exceto os applets que não estão listados acima, se/proc/self/exe
não estiver disponível).¹ Na verdade, existem duas implementações de "sh" no BusyBox - cinzas e silêncio - mas eles se comportam da mesma maneira a este respeito.
fonte
FEATURE_PREFER_APPLETS
eFEATURE_SH_STANDALONE
são sinalizadores de tempo de compilação, ativando ou desativando recursos. Os applets estão marcadosnofork
enoexec
independentemente de quais sinalizadores foram usados. Se essas marcações têm ou não efeito, depende daFEATURE_PREFER_APPLETS
ativação. Portanto, três comportamentos possíveis: 1.FEATURE_PREFER_APPLETS
desativado, 2.FEATURE_PREFER_APPLETS
ativado e com appletnofork
, 3.FEATURE_PREFER_APPLETS
ativado e com appletnoexec
. O terceiro parágrafo na documentação explica bem. E a última seção mostra os casos possíveis.FEATURE_SH_STANDALONE
(que requerFEATURE_PREFER_APPLETS
).nofork
não é necessário. ComFEATURE_SH_STANDALONE
,/proc/self/exe
é usado onde aplicável, portanto, ele funcionará mesmo que o BB tenha sido excluído . Você pode testar isso com o risco bastante mínimo em qualquer systm Debian ou Arch Linux, runbusybox ash
,unset PATH
, faça comandos da bacia. Funciona bem.cat
nemchmod
exigem exec-ing um caminho, você pode recuperar o executável assim:cat /proc/self/exe > busybox; chmod 755 busybox
.tac
requer um arquivo de entrada pesquisável que nem sempre está disponível ou a leitura de toda a entrada na memória.cat
pode ler sua entrada do início ao fim, descartando o que já foi processado. É muito mais fácil de implementar e também é muito mais usado, por isso faz mais sentido otimizar esse.FEATURE_xxx
é uma opção em tempo de compilação para o BusyBox como um todo. As indicações nofork e noexec importam apenas seFEATURE_PREFER_APPLETS
estiverem ativas (pelo menos com a finalidade de executar um comando no shell, elas também são usadas em outros contextos).is there a way to safely test it?
Com a imagem openwrt genérica x86:A maioria dos comandos não é incorporada, mas alguns são, como
echo
eprintf
. Um arquivo binário com conteúdo arbitrário pode ser criado usandoprintf
, maschmod +x
será um problema.fonte
/bin/ash -> busybox
.FEATURE_SH_STANDALONE
estiver ativado, você não receberá esse comportamento. O segundomv
funcionará perfeitamente bem.