Android RIL에서 C 언어로 root 권한 필요한 shell command 실행이 불가능한가요?
linux에서 사용하는 shell program을 Android용에 맞게끔 cross-compile해서 하였고
Android의 /system/bin에 static file로 추가하였습니다.
그리고 Android 디바이스에서 shell prompt에서 $ su 0 test_command /dev/USB0 1 를 실행해서
해당 shell command가 /dev/USB0 와 연동하여 정상적으로 동작하는것까지 확인 했습니다.
그런데 /dev/USB0를 접근하는 커맨드이다 보니 실행시 root 권한이 필요한 shell program 입니다.
그래서 유저모드인 $ 상태에서 $ su 0 를 앞에 입력해서 실행되는걸 확인했고
아니면 $ su 를 쳐서 root 모드 # 으로 바뀐후에 # test_command /dev/USB0 1 를 실행해야 했습니다.
cross-compile한 실행파일을 Android에 추가하고 직접 shell command를 입력해서 확인한 후에
최종단계로 vendor RIL인 C 언어 소스에서 새로 추가한 shell command를 실행하려고 하려고
알아보니 system( ) 이나 popen( ) 을 이용하면 된다고 나오더라구요.
ex 1) system 방식
int check; check = system("test_command /dev/USB0 1"); if(check != 0) LOGD("error");
ex 2) popen 방식
FILE *fp; fp = popen("test_command /dev/USB0 1", "r"); //fgets 또는 fread로 shell program 실행 결과 message 확인 pclose(fp);
위와 같이 제가 추가한 test_command를 호출해 보니 아무것도 실행되지 못하고 있습니다.
혹시나 싶어서 "ls -l"로 커맨드를 바꿔보니 정상적으로 실행되는걸 보고
제가 system( ) 이나 popen( )로 shell program 실행하는 소스를 잘못 구현한게 아닌건 확인했습니다.
제가 Android에서 이런 부분에 대한 작업이 처음이다 보니 잘 모르는 부분인데
지금 이 문제가 Android에서 vendor RIL이 root 권한이 아니기 때문에
실행시 root 권한이 필요한 shell program을 실행하지 못하는 상황처럼 보이는데
이럴때 어떻게 하면 root 권한을 가진 shell program을 실행할수 있는지 문의 드립니다.
참고로 안드로이드는 AOSP 9.0 pie 버전에서 확인중입니다.
Q1. 혹시 root 권한이 필요한 shell program을 실행시키키려면,
sepolicy 관련하여 .te 파일 등으로 뭔가 등록/설정 등을 해줘야만
root 권한을 가진 shell program을 실행시킬수 있는 건가요?
Q2. 아니면 Android 에서는 리눅스와 달리
root 권한이 필요한 shell program을 실행 시킬 방법이 없는건가요?
Andoird의 vendor RIL인 C 소스에서 root 권한이 필요한 shell program을 어떻게 실행하고
그 결과를 얻어올 수 있는지 관련하여 방법이나 예제가 있다면 조언 부탁드립니다.
감사합니다.
3가지 방법이 생각나는 군요.
1. Android emulator에서 확인해 보니 rild가 radio 계정으로 실행되고 있던데, 이것을 root 계정 권한으로 실행
2. /dev/USB0 를 /dev/ppp 처럼 radio권한으로 생성하여 radio 계정 권한으로 실행된 rild에서 접근 가능하게
3. 보안에 문제가 없다면, /dev/USB0의 접근 권한을 모두 풀어 어떤 계정권한으로도 접근 가능하게
2번 방법에 대한 질문 드립니다.
3가지 방법에 대한 조언 너무 감사드립니다.
아무래도 2번 방법인 rild 와 vendor RIL의 radio 권한으로만 사용 가능한게 좋을것 같은데
ls -l로 확인해보니 ttyUSB0가 이미 radio 권한으로 설정되어 있었습니다.
혹시 /dev/ttyUSB0 외에 static으로 추가한 test_command 실행 파일에 대해서도
radio용으로 권한 설정을 해주면 C 소스에서 실행이 가능해질까요?
질문에는 test_command 하나만 언급했지만
test_command 와 test_proxy 라는 2개의 shell program 파일이 실행되는 상황입니다.
< 동작 예시 >
1. shell에서 "$ su 0 test_command /dev/ttyUSB0 1"라고 명령을 실행하면
2. test_command이 실행되면서 test_proxy를 추가로 호출(실행)하며
3. test_command와 test_proxy 실행 파일이 /dev/ttyUSB0를 접근하여 데이터 통신을 수행합니다.
조언을 참고하여 현재 이미 /dev/ttyUSB0는 radio 설정중인 상태이니
실행 파일을 radio 권한으로 바꿔서 시도를 한번 해보겠습니다.
혹시 제가 놓친 부분이나 더 고려해야할 부분이 있다면 조언 부탁드립니다.
감사합니다.
댓글 달기