BusyBox 명령은 실제로 내장되어 있습니까?


28

나는 유명한 유닉스 복구 전설 을 읽고 있었고 , 궁금해했습니다.

BusyBox 셸이 열려 있고 BusyBox 이진 자체가 삭제 된 경우에도 BusyBox 이진에 포함 된 모든 명령을 계속 사용할 수 있습니까?

BusyBox 파일 자체 를 열고 실행할 수 없으므로 다른 실행중인 쉘 에서 BB 버전의 명령을 bash사용할 수 없습니다 bash. 그러나 BusyBox의 실행중인 인스턴스에서 BB가 명령을 실행하는 데는 두 가지 방법이있을 수 있습니다.

  1. BusyBox의 새 인스턴스를 분기하고 실행하여 적절한 이름으로 호출하고 디스크에서 BusyBox 파일을 읽습니다.
  2. 지정된 명령을 실행하기 위해 (예 : 함수 호출로 실행) 내부 논리를 분기하고 수행 할 수 있습니다.

(1)이 BusyBox가 작동하는 방식이라면 BB 바이너리가 삭제 된 후 실행중인 BB 인스턴스에서 특정 BusyBox 제공 명령을 사용할 수 없을 것으로 예상됩니다.

(2)가 작동하는 방식이라면 BusyBox는 BB 자체가 삭제 된 시스템의 복구에도 사용할 수 있습니다.

이것은 어디에나 문서화되어 있습니까? 그렇지 않은 경우 안전하게 테스트하는 방법이 있습니까?


2
is there a way to safely test it?일반 86 다운로드 openwrt이미지를 새로운 버추얼 머신에 이미지를 첨부
유역

2
그리고 이것은 Busybox 명령 이 설정되지 않은 후에 어떻게 계속 작동 PATH합니까? 기본값을 PATH?로 가정합니까 ?
muru

2
@muru : 소스 코드 (적어도 ash 클론의 경우)에서 설정되지 않은 PATH를 빈 문자열과 동일하게 처리하므로 현재 디렉토리를 검색합니다.
Henning Makholm

@HenningMakholm 글쎄, 내 의견은 Gilles의 답변에 의해 답변되었습니다. 그러나 알아두면 좋을 것입니다. 내장 기능 만 작동 할 것으로 기대했습니다.
muru

답변:


33

기본적으로 BusyBox는 내장 애플릿 (에 나열된 명령 busybox --help) 과 관련하여 특별한 작업을 수행하지 않습니다 .

그러나 컴파일시 FEATURE_SH_STANDALONEFEATURE_PREFER_APPLETS옵션이 활성화 된 경우 BusyBox sh¹는 알려진 애플릿 이름 인 명령을 실행할 때 일반 PATH조회를 수행하지 않고 대신 바로 가기를 통해 내장 애플릿을 실행합니다.

  • 소스 코드에서 "noexec"로 선언 된 애플릿은 분기 프로세스에서 함수 호출로 실행됩니다. 비지 박스 1.22, 다음 애플릿 NOEXEC 있습니다 : 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.
  • 소스 코드에서 "nofork"로 선언 된 애플릿은 동일한 프로세스에서 함수 호출로 실행됩니다. 비지 박스 1.22, 다음 애플릿 nofork 있습니다 : [[, [, basename, cat, dirname, echo, false, fsync, length, logname, mkdir, printenv, printf, pwd, rm, rmdir, seq, sync, test, true, usleep, whoami, yes.
  • 다른 애플릿 정말 (로 실행 fork하고 execve)하지만, 대신 일의 PATH조회, 비지 박스가 실행 /proc/self/exe(일반적으로 리눅스의 경우), 사용 가능한 경우, 그리고 경로 그렇지 않으면 컴파일시에 정의했다.

자세한 내용은에 자세히 설명되어 docs/nofork_noexec.txt있습니다. 애플릿 선언은 include/applets.src.h소스 코드에 있습니다.

대부분의 기본 구성은 이러한 기능을 해제하여 BusyBox가 다른 쉘과 같은 외부 명령을 실행하도록합니다. 데비안은이 기능을 패키지 busyboxbusybox-static패키지 모두에서 켭니다 .

따라서 FEATURE_SH_STANDALONE및로 컴파일 된 BusyBox 실행 파일이있는 FEATURE_PREFER_APPLETS경우 실행 파일이 삭제 된 경우에도 BusyBox 쉘에서 모든 BusyBox 명령을 실행할 수 있습니다 (위에 나열되지 않은 애플릿을 제외하고 /proc/self/exe는 사용할 수없는 경우).

¹ BusyBox에는 ash와 hush라는 두 가지 "sh"구현이 있지만 이와 관련하여 동일한 방식으로 작동합니다.


1
@Wildcard FEATURE_PREFER_APPLETS이며 FEATURE_SH_STANDALONE컴파일 타임 플래그이며 기능을 활성화 또는 비활성화합니다. 애플릿이 표시됩니다 noforknoexec사용 된 플래그에 관계없이. 이러한 표시가 효과가 있는지 여부 FEATURE_PREFER_APPLETS는 활성화 여부에 따라 다릅니다 . 따라서, 세 가지 행동 1. FEATURE_PREFER_APPLETS비활성화 2. FEATURE_PREFER_APPLETS활성화 및 애플릿은 nofork, 3. FEATURE_PREFER_APPLETS활성화 및 애플릿입니다 noexec. 문서의 세 번째 단락은 그것을 잘 설명합니다. 그리고 마지막 섹션은 가능한 경우를 보여줍니다.
muru

1
@Wildcard FEATURE_SH_STANDALONE(이 필요함 FEATURE_PREFER_APPLETS). nofork필요하지 않습니다. 으로 FEATURE_SH_STANDALONE, /proc/self/exe해당되는 경우 사용되는, 그래서 작동 BB가 삭제 된 경우에도 . 당신은 아주 최소한의 어떤 데비안이나 아치 리눅스 SYSTM에 위험을 실행하여이를 테스트 할 수 있습니다 busybox ash, unset PATH, 유역의 명령을한다. 잘 작동합니다.
muru

3
Ubuntu 14.04.1 LTS 시스템에서 Busybox는 애플릿을 선호하도록 구성되어 있습니다. 경로 이름을 실행할 필요 도 cat없고 chmod, 따라서 실행 파일을 다음과 같이 복구 할 수 있습니다 cat /proc/self/exe > busybox; chmod 755 busybox.
Barefoot IO

1
@forest 큰 차이 tac가 있습니다. 항상 사용할 수있는 검색 가능한 입력 파일이 필요하거나 전체 입력을 메모리로 읽어야합니다. cat입력을 처음부터 끝까지 읽고 이미 처리 된 내용을 무시할 수 있습니다. 구현하기가 훨씬 쉽고 훨씬 일반적으로 사용되므로이를 최적화하는 것이 더 합리적입니다.
hvd

1
@Wildcard Nofork 및 noexec는 각 애플릿에 설정된 표시입니다. FEATURE_xxxBusyBox의 컴파일 타임 옵션입니다. nofork 및 noexec 표시 FEATURE_PREFER_APPLETS는 활성 상태 인 경우에만 중요합니다 (적어도 쉘에서 명령을 실행하기 위해 다른 컨텍스트에서도 사용됨).
Gilles 'SO- 악의를 멈춰라'

8

is there a way to safely test it? 일반 x86 openwrt 이미지를 사용하는 경우 :

vbox 스크린 샷

대부분의 명령은 내장되어 있지 않지만 일부는 like echoprintf입니다. 를 사용하여 임의의 내용을 가진 이진 파일을 만들 수 printf있지만 chmod +x문제가 될 것입니다.


흥미있는; BusyBox 자체 또는 다른 쉘에서 실행합니까?
와일드 카드

4
(또한 스크린 샷이 아닌 텍스트를 붙여 넣어 주시겠습니까?)
Wildcard

@ 와일드 카드 /bin/ash -> busybox.
분지

1
Gilles의 답변에서와 같이 FEATURE_SH_STANDALONE활성화하면이 동작을 얻지 못합니다. 두 번째 mv는 완벽하게 작동합니다.
muru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.