2013년 1월 23일 수요일

selinux 003 둘러보기

이번엔 구글 안드로이드 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"
# restorecon -rv /home
http://syynice.egloos.com/8747468
-----------------------------------------------
인터넷에서 찾은 두 가지 경우를 볼 때
CONTEXT 정보가 제대로 붙지 않은 경우(TYPE이라고 할 수도 있을까..)
문제가 발생하는데 이 때 해당 디렉토리에 제대로된 context 값을 붙여주는 엯할을 한다.
그게 file context에 있는 값을 기준으로 하는 건지 그냥 그 디렉토리 이름을
변형해서 해 주는 것인지는 소스를 까봐야 알 듯.
변경파일
android/system/core/rootdir/init.rc
android/system/core/rootdir/etc/init.goldfish.rc

댓글 8개:

  1. 안녕하세요~
    저도 seandroid에 관심이 많은데, 개인적으로 이렇게 공부하시는건가요?

    답글삭제
  2. 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가 타켓 타입이다.

    답글삭제
  3. 역시나 트레시스 자료

    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만 봐선 알기 어렵군)
    믓튼 롤은 하나의 그룹 같은 거네.

    답글삭제
  4. 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

    답글삭제
  5. 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


    답글삭제
  6. 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만 라인이면 된다는 거닷! 그루핑 안하면 ㅡㅡ;

    답글삭제
  7. 안드로이드 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 으로 빌드 해 준다.

    답글삭제

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...