이번엔 구글 안드로이드 4.2.1_r1에서 rootdir쪽을 살펴본다.
init.rc를 보면
# Set the security context for the init process.
# This should occur before anything else (e.g. ueventd) is started.
setcon u:r:init:s0
.
.
.
service ueventd /sbin/ueventd
class core
critical
seclabel u:r:ueventd:s0
.
.
.
# adbd is controlled via property triggers in init.
.usb.rc
service adbd /sbin/adbd
class core
socket adbd stream 660 system system
disabled
seclabel u:r:adbd:s0
뭐 setcon이나 setlabel이나
context를 정의해 주는 것인데....
https://android.googlesource.com/platform/system/core/+/e46f9d510db9351682cf17c49115110870147335
에 보면
init:
- Load policy at boot.
- Set the security context for service daemons and their sockets.
- New built-in commands: setcon, setenforce, restorecon, setsebool.
- New option for services: seclabel.
서비스를 위한 옵션이라고 되어 있다.
음... 좋아 서비스에는 쟬 써야해...
selinux에서처럼
# setsebool -P httpd_can_network_connect_db on
bool값의 종류들을 알아두면 관련 서비스가 안 먹을 때 setsebool로 해결이 가능할 것도 같다.
다시 소스로 돌아가서 rootdir 아래쪽에
init.goldfish.rc를 보면
on boot
setsebool in_qemu=1
restorecon /sys/qemu_trace/process_name
restorecon /sys/qemu_trace/state
restorecon /sys/qemu_trace/symbol
이런 부분도 패치가 되었다.
골드피쉬가 붙는 것들은 에뮬레이터를 위한 녀석이다.
http://fedoraproject.org/wiki/SELinux/restorecon
보면 설명이 있는데
역시나 context 설정을 위한 친구다.
restorecon(8) restorecon(8)
NAME
restorecon - set file security contexts.
This manual page describes the restorecon program.
This program is primarily used to set the security context (extended
attributes) on one or more files.
It can be run at any time to correct errors, to add support for new
policy, or with the -n option it can just check whether the file con-
texts are all as you expect.
에러 잡을 때 쓴다는데 그럼 어떤 에러들이 있는 것일까?
-----------------------------------------------
You don't have permission to access /...../... on this server.
이란 403 퍼미션
에러가 났을 경우.
# restorecon -R -v /documentroot
http://allegrett0.tistory.com/entry/restorecon
-----------------------------------------------
Forbidden
You don't have permission to access / on this server.
/var/log/audit/audit.log 에 다음과 같이 에러가 뜹니다.
type=AVC
msg=audit(1177139220.333:330): avc: denied { getattr } for pid=4337 comm="httpd"
name="phpMyAdmin-2.9.1.1-all-languages" dev=dm-0 ino=6418532
scontext=root:system_r:httpd_t:s0 tcontext=root:object_r:user_home_t:s0
tclass=dir
type=SYSCALL msg=audit(1177139220.333:330): arch=40000003
syscall=196 success=no exit=-13 a0=91d5f38 a1=bf90d63c a2=265ff4 a3=2008171
items=0 ppid=4332 pid=4337 auid=0 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48
sgid=48 fsgid=48 tty=(none) comm="httpd" exe="/usr/sbin/httpd"
subj=root:system_r:httpd_t:s0 key=(null)
type=AVC_PATH
msg=audit(1177139220.333:330): path="/var/www/html/somedir"
http://syynice.egloos.com/8747468
-----------------------------------------------
인터넷에서 찾은 두 가지 경우를 볼 때
CONTEXT 정보가 제대로 붙지 않은 경우(TYPE이라고 할 수도 있을까..)
문제가 발생하는데 이 때 해당 디렉토리에 제대로된 context 값을 붙여주는 엯할을 한다.
그게 file context에 있는 값을 기준으로 하는 건지 그냥 그 디렉토리 이름을
변형해서 해 주는 것인지는 소스를 까봐야 알 듯.
변경파일
android/system/core/rootdir/init.rc
android/system/core/rootdir/etc/init.goldfish.rc
안녕하세요~
답글삭제저도 seandroid에 관심이 많은데, 개인적으로 이렇게 공부하시는건가요?
객관식으로 알려주세요 :)
삭제setuid와 setgid, sticky bit에 관하여...
답글삭제set uid는 잠시 user id를 빌리는 것이며,
set gid는 잠시 group id를 빌리는 것,
stick bit는 다른 유저 파일은 수정 삭제가 불가능.
4000, 2000, 1000으로 일반적인 리눅스 상황에서의 user group others 권한과 비슷하다.
공용폴더에서 자기 폴더의 파일들만 사용할 수 있게 하려면 stick bit를 설정하는 것이다.
보통 root만 passwd를 할 수 있는데 다른 사용자도 해당 명령어를 통해서 passwd 변경을 해주도록
euid를 바꾸게 해 준다고 트레시스(주) 문서에 나와있다. 친절하게 그림으로.
euid는 ruid와 비슷한 개념으로 r은 real이고 e는 effective이다. 접근 권한 설정 통제는 euid는
통해 이루어지며 일반적으로 (r)uid와 euid는 동일하게 보면 된다.
suid로 동작할 하는게 있으면 타입 트랜지션이 필요하게 된다.
allow passwd_t passwd_exec_t : file entrypoint;
allow user_t passwd_t : process transition;
type_transition user_t passwd_exec_t : process passwd_t;
allow user_t passwd_exec_t : file { getattr execute };
type_transition은 예약어, user_t가 소스 타입 passwd_t가 타켓 타입이다.
역시나 트레시스 자료
답글삭제Roles associates domains with users
further constrains process type transitions
process type allowed only if allowed by role definition
even if type enforcement allows it
Role declaration statement
role user_r types passwd_t;
role 예약어 적고
유저 적고
타입 예약어 적고
타입 적고
allow passwd_t passwd_exec_t : file entrypoint;
allow user_t passwd_t : process transition;
type_transition user_t passwd_exec_t : process passwd_t;
allow user_t passwd_exec_t : file { getattr execute };
요게 간단히
role user_r types passwd_t;
요렇게 전환 가능하다는 의미. 그런데 얘는 어느 타이밍에 이렇게 되어야 한다는 말인가?
policy conf 파일은 하난데... 미리 user_r:user_t가 user_r:passwd_t로 변형되지 않는다면 언제
변경된다는 거지?(PDF만 봐선 알기 어렵군)
믓튼 롤은 하나의 그룹 같은 거네.
configurable mandatory access control
답글삭제 flexible (not tied to a single security objective)
dynamic (loadable/conditional policy)
possible to be pragmatic within a policy
even necessary due to Linux legacy!
fine-grained access control
object classes and permissions, unlimited types and rules
Useful for a large number of security goals and
objectives
System integrity, RVM/kernel self-protection
raw devices and resources
kernel configuration and binary files (e.g., modules)
daemon/services configuration and binary files
protection of SELinux policy itself
Application integrity
configuration and binary files
inter-process communication
Least privilege
preventive security engineering design
protection of privileged user environments
Controlled execution domains
답글삭제 isolation of untrusted code (e.g., sandboxes)
prevention of malicious code in trusted domains
System Hardening
confinement of error propagation (exploitations)
fine-grained access control
Domain isolation
trusted from untrusted
application from application
Information flow policies
Multilevel security and multiple security levels
Guards and other cross-domain solutions
Perimeter defense
Controlled execution domains
isolation of untrusted code (e.g., sandboxes)
prevention of malicious code in trusted domains
System Hardening
confinement of error propagation (exploitations)
fine-grained access control
Domain isolation
trusted from untrusted
application from application
Information flow policies
Multilevel security and multiple security levels
Guards and other cross-domain solutions
Perimeter defense
Policies are usually complex
Due to complexity of Linux kernel
legacy issues with Linux/Unix
need for Pragmatism
Flexibility comes with a price!
41 kernel object classes, hundreds of permissions
thousands of object instances
unlimited domain and object types
Assurance of mechanism evolving
open source model helps
certainly no worse than Linux (or other mainstream OSs)
in fact much better with a good TE policy
Standard Linux and SELinux access control
mechanisms are orthogonal
SELinux security context: user:role:type
applied to both objects and subjects
type is the primary means of controlling access
Fine grained access control
41 kernel object classes, hundreds of permissions
Access must be explicitly allowed in TE policy
all access denied by default
TE allow statement:
allow domain_type object_type: classes permission ;
specifies allowed access based on types
TE domain transition:
changing of process type (domain) on execve()
type_transition specifies default transition
Type enforcement flexible
can implement many security properties
Roles further constrain domain transitions
41개의 커널 오브젝트가 있는데 모두 허용하려면 100개의 permission으로 계산
답글삭제1 <-> 2 200개
1 <-> 3 200개
1 <-> 4 200개
.
.
.
8200 + 8000 + 7800 + ...
우분투 배시셀을 이욯해 보자.
# j=0
# for((i=8200;i>0;i-=200))do let j+=$i; echo $j; done
헐 172200 가지...
퍼미션이 100개면 17만 라인이면 된다는 거닷! 그루핑 안하면 ㅡㅡ;
안드로이드 sepolicy 파일은 부분 컴파일이 가능하다.
답글삭제http://www.kaisyu.com/notes/google-android/android-envsetupsh
에 가보면 몇가지 유틸 소개가 있는데 이걸 읽고 나면 명령어 이해가 한결 쉽다.
android 폴더에서 쉘스크립트 셋을 얻는다.
source build/envsetup.sh
그러면 lunch 명령어를 쓸 수 있게 된다.
http://source.android.com/source/building.html
요기에 자세한 설명이 있다.
풀컴을 한번 한거면 android out target product에 있는 product 이름을 보고 -eng나 -user를
붙여주면 된다.
그리고 android/external/sepolicy로 가서
mm 으로 빌드 해 준다.