안드로이드 디버그 브리지

**안드로이드 디버그 브리지**(Android Debug Bridge)는 안드로이드 기반 기기들의 디버깅에 사용되는 프로그래밍 도구이다. 안드로이드 장치의 데몬은 USB나 TCP를 통해 호스트 PC의 서버에 연결하며, TCP를 통해 최종 사용자에 의해 사용되는 클라이언트에 연결된다. 2007년부터 구글이 아파치 라이선스로 오픈 소스 소프트웨어로 배포하고 있으며 셸을 내장하고 있고 백업도 가능하다. adb 소프트웨어는 마이크로소프트 윈도우, 리눅스, macOS와 호환된다. 봇넷 및 기타 악성 소프트웨어에 의해 악용되었으며, 이를 위해 RSA 인증 및 장치 화이트리스팅과 같은 완화 조치가 개발되었다.

## 기능
섬네일|left|안드로이드 장치 모니터
adb의 기능에는 호스트 컴퓨터에서 파일 복사, 앱 설치, logcat 출력 보기, 유닉스 셸 가져오기, 퀄컴 EDL 모드로 재부팅 등이 있다. 예를 들어, 안드로이드 애플리케이션은 `[[백업]]` 명령을 사용하여 파일로 저장할 수 있다. 또한 자바 디버그 와이어 프로토콜에 대한 지원도 포함된다.

일부 그래픽 사용자 인터페이스도 제공되었다. 안드로이드 스튜디오의 그래픽 안드로이드 장치 모니터는 안드로이드 장치에서 정보를 검색하는 데 사용할 수 있다.

안드로이드 장치에 APK 파일을 설치하는 안드로이드의 방식은 Windows Subsystem for Android 및 크롬 OS의 안드로이드 가상 머신에 비공식 앱을 사이드로드하는 방법으로 사용되었다.

Shizuku를 사용하면 안드로이드 전화가 무선 네트워크에 연결되었을 때 자체 ADB에 연결할 수 있다. 이 애플리케이션은 구글 플레이 스토어에서 무료로 사용할 수 있다.

## 개발 역사
안드로이드 소프트웨어 개발 키트 (SDK)는 2007년에 처음 출시되었다. 2017년부터 구글은 안드로이드 SDK와 별도로 adb를 다운로드할 수 있도록 했다.

2015년 마이크로소프트는 adb 클라이언트에 연결할 수 있는 안드로이드 에뮬레이터를 출시했다. 2016년 안드로이드 스튜디오 2.0에서는 adb를 통한 앱 설치 및 파일 푸시 성능이 5배 향상되었다. 2017년 안드로이드 씽스의 사용 편의성을 위해 수동 adb 명령을 래핑하는 래퍼가 만들어졌다. 2020년 안드로이드 11에서는 adb 점진적 설치 기능이 추가되었다. 2020년 macOS용 안드로이드 스튜디오에 Wi-Fi adb가 통합되었다. 2021년 안드로이드 12에서는 `adb backup` 명령이 제한되어 앱의 사용자 데이터 백업이 앱별 매니페스트 구성을 통해 옵트인 방식으로 이루어지도록 변경되었다. 이는 안드로이드 10에서 `adb restore`와 함께 사용 중단된 이후의 조치이다. 구글 퓨시아는 adb와 하위 호환성을 가질 예정이다. adb는 fx와 ffx로 대체될 것이다.

## 설정

### 호스트 컴퓨터
윈도우의 경우 안드로이드 SDK에 adb.exe 바이너리가 포함되어 있으며, 이를 추출하여 설치할 수 있다. 하우투긱은 바이너리가 포함된 폴더를 PATH 환경 변수에 추가할 것을 권장한다.

우분투에서는 `android-tools-adb` 패키지를 통해 adb를 설치할 수 있다. 데비안의 경우, `adb` 패키지 옆에 `android-sdk-platform-tools-common` 패키지도 설치하여 Udev 규칙을 적용하면 루트 권한 없이 도구를 실행할 수 있도록 권장된다. macOS 및 다른 리눅스 배포판에서는 플랫폼 도구를 다운로드하고 bashrc에서 PATH 변수를 수정할 수 있다.

### 안드로이드 장치
안드로이드 4.2.2 이상 ((API 레벨 17))에서는 사용자가 수락해야 하는 RSA 지문 대화 상자가 표시된다. 이는 장치 사용자의 동의 없이 디버깅 메커니즘을 악용하는 컴퓨터로부터 보호한다. 안드로이드 4.2부터 개발자 옵션은 기본적으로 숨겨져 있다. 정보 메뉴에서 빌드 번호를 7번 누르면 사용자에게 표시된다. 그 후 USB 디버깅 옵션을 활성화할 수 있다. 일부 안드로이드 공급업체는 이를 활성화하는 절차가 다르다. 예를 들어 화웨이는 adb를 활성화하기 전에 PIN 코드를 입력해야 한다.

안드로이드 장치의 터치스크린이 고장난 경우, USB 온더고를 사용하여 장치에 마우스를 연결하고 USB 디버깅을 활성화할 수 있다.

## 아키텍처
adb 프로토콜은 USB 또는 TCP를 통해 와이파이로 전송될 수 있다. 클라이언트-서버 아키텍처를 사용한다. 사용되는 두 가지 다른 프로토콜이 있다. 첫 번째는 클라이언트와 서버 간이고, 두 번째는 서버와 데몬 간이다. adb 데몬은 C로 구현되었으며 안드로이드 사용자 공간에 위치한다. 데몬은 안드로이드 USB 프레임워크인 `UsbDeviceManager` 및 `UsbDebuggingManager`에 의해 지원된다.

### 클라이언트 ↔ 서버 프로토콜
클라이언트와 서버 간의 통신 모드는 TCP 소켓이다. 서버는 포트에서 수신 대기하며, 클라이언트는 이 포트로 요청을 보내야 한다. 요청에는 4바이트 ASCII 초기 필드와 페이로드가 포함된다. 페이로드는 서버로 전송되어야 함을 나타내기 위해 host라는 단어로 시작한다. 그러면 서버는 상태를 나타내는 OKAY 또는 FAIL로 응답할 수 있으며, 선택적 페이로드 및 길이와 함께 제공될 수 있다.

### 서버 ↔ 데몬 프로토콜
서버에서 전송되는 메시지는 다음과 같은 필드를 가진 24바이트 길이의 헤더로 구성된다.

* 명령
* 첫 번째 인수
* 두 번째 인수
* 페이로드 길이, 0 이상
* 데이터 페이로드의 CRC-32
* 매직 값, 명령 XOR `0xFFFFFFFF`를 통해 계산됨

## 보안
안드로이드 2.2까지 안드로이드는 RageAgainstTheCage 익스플로잇에 취약했다. adb 데몬은 권한 하강 시 setuid 시스템 호출의 반환 값을 확인하지 않았다. 익스플로잇은 프로세스 식별자의 고갈로 인해 실패할 때까지 프로세스를 포크한다. 데몬이 충돌하고 다시 시작하면 권한이 하강된 새 프로세스를 시작할 수 없으며 루트로 계속 실행된다. 그러면 adb는 루트 셸을 제공했다. 2017년에는 ADB를 악용하여 온보드 모뎀을 장악하는 보안 취약점이 공개되었다. 이 공격은 adb가 이미 활성화되고 승인되어 있어야 했지만, 일부 해결 방법이 있었다.

ADB.Miner, Ares, IPStorm, Fbot, Trinity와 같은 다양한 악성 소프트웨어군은 인터넷에서 adb 인터페이스의 공개 가용성을 스캔하고 해당 장치에 악성 소프트웨어를 설치했다. adb는 안전 모드로 부팅하고 `adb uninstall` 명령을 실행하여 악성 소프트웨어를 제거하는 데도 사용될 수 있다.

## 같이 보기
* 패스트부트
## 각주

## 외부 링크
* Android Debug Bridge - Android Developers
* ADB and Fastboot guide, LineageOS
* Android Debug Bridge, Arch Linux wiki
* , Gentoo Linux wiki
* Android Debug Bridge, Droid Wiki 

분류:안드로이드 (운영체제)
분류:디버깅
분류:통신 프로토콜
분류:안드로이드 개발 소프트웨어