检查android(v30)selinux策略


12

我正在尝试使用selinux查找我的手机实际执行的策略。您会认为这很容易。毕竟,为了安全起见,最好验证您的策略是否符合预期。不幸的是,我发现这很难做,因为A)android似乎使用了分叉的策略版本30,b)策略工具链似乎具有非常低质量的构建过程(很多硬编码路径等) )。

这是我尝试过的两件事,没有奏效。如果我尝试使用现成的setools工具(例如打包为fedora打包的工具,或者可以通过Arch Linux安装在AUR上),那么我将得到以下内容(/sepolicy从电话的根目录或工厂映像中提取之后):

$ sedispol sepolicy 
Reading policy...
libsepol.policydb_read: policydb version 30 does not match my version range 15-29
sedispol:  error(s) encountered while parsing configuration
$ sesearch --all sepolicy 
ERROR: policydb version 30 does not match my version range 15-29
ERROR: Unable to open policy sepolicy.
ERROR: Success
$

好的,这表明我必须构建selinux库的android版本。AOSP源代码树带有一些工具的预编译版本,但是这些依赖于我没有的旧共享库(例如libpcre3)。无论如何,如果检查安全策略的唯一方法是信任一些脱离网络的二进制共享库,那将非常令人震惊。

所以这就是我构建android selinux库的方法。在arch上,我必须ustr-selinux从AUR 安装,因为ustr使用inline了现在需要使用的位置static inline。好的,到目前为止很好。不幸的是,构建过程确实很繁琐,但是我能够使用以下方法编译并安装足够的代码:

git clone https://android.googlesource.com/platform/external/selinux \
    android/external/selinux
export ANDROID_BUILD_TOP=$PWD/android
DESTDIR=$HOME/android_selinux
export LD_LIBRARY_PATH="$DESTDIR/lib:$DESTDIR/usr/lib"
cd android/external/selinux
sed -ie '/^LDLIBS.*(LIBDIR)/s/$/ ..\/lex.yy.o/' checkpolicy/test/Makefile
make install DESTDIR="$DESTDIR" \
     PREFIX='$(DESTDIR)/usr' \
     CFLAGS='-I$(PREFIX)/include' \
     -j20 -k
cp checkpolicy/test/dispol "$DESTDIR/usr/sbin/sedispol"
cp checkpolicy/test/dismod "$DESTDIR/usr/sbin/sedismod"

在这一点上,sedispol可以使用普通的SElinux策略(例如policy.29fedora的29版),但仍无法显示android的运行情况:

$ ~/android_selinux/usr/sbin/sedispol sepolicy 
Reading policy...
libsepol.avtab_read_item: more than one specifier
libsepol.avtab_read: failed on entry 457 of 5582
/home/user/android_selinux/usr/sbin/dispol:  error(s) encountered while parsing configuration
$ 

我还尝试setools3针对android库编译香草工具。再次,并非易事,但我可以使用它:

DESTDIR=$HOME/android_selinux
export LD_LIBRARY_PATH="$DESTDIR/lib:$DESTDIR/usr/lib"
git clone https://github.com/TresysTechnology/setools3.git
cd setools3
./configure --prefix=$DESTDIR/usr --with-sepol-devel=$DESTDIR/usr CPPFLAGS="-I$DESTDIR/usr/include -L$DESTDIR/usr/lib"
make -k -j20

这并没有完全构建,但是构建了足以执行的源代码树secmds/sesearch。这种处理方式适用于原始policy.29文件(我可以搜索-A-T,但可以--all给我operation not supported)。但是,当尝试检查android版本30文件时,它完全失败并显示类似错误:

$ ./secmds/sesearch -A sepolicy 
ERROR: more than one specifier
ERROR: failed on entry 457 of 5582
ERROR: Unable to open policy sepolicy.
ERROR: Success
$ 

在这一点上,我的想法有点令人困惑,因为围绕诸如系统安全策略这样至关重要的工具很难构建。当然,我一定做错了。有没有人真正设法检查android安全策略而不依赖于外部分发的二进制共享库?

我应该补充一点,我还尝试了建议的用于重建所有预建工具(ndk/build/tools/download-toolchain-sources.shndk/build/tools/rebuild-all-prebuilt.sh)的技术。但是,该download-toolchain-sources.sh脚本当前已损坏。它试图检出不再存在于存储库中的旧版本目录,尽管它prebuilts/python包含与selinux相关的代码,但无论如何它似乎都没有下载任何与selinux相关的工具。同样,这些构建系统多么笨拙,令我感到震惊,并认为必须有一种更简单的方法。问题是如何获得可用来检查android selinux策略的工具?

Answers:


8

首先,我必须承认,我完全同意您的“我发现这很难做到”的说法。Google主要从消费者的角度设计Android,而不是为高级用户设计的。结果是,只要您想在使用最新的Facebook应用程序或使用Candy Crush进行游戏以外的其他事情时,您很快就会回到2000早期Linux的境界,那时需要类似开发人员的知识来进行更改什么应该是简单的设置。我相信,随着Android系统变得更加成熟,这种情况将会迅速发展,但是现在我们必须与已经拥有的东西有关...

如您所说,有两个原因需要编译您自己的SELinux工具集:

  • 系统提供的工具集通常是后面的版本。虽然Android的SELinux依赖于政策DB版本30,但当前的Linux机器通常只能处理29版本以下的版本。
  • 即使是较新的版本也无济于事,实际上,从上游代码构建SELinux (这很容易做到,至少在遵循上游建议的Fedora计算机上如此)有效地允许系统处理政策DB版本30,但是Android的SELinux已经进行了重大修改(Google文档着重介绍了一些修改),因此由于语法和解析错误,尝试处理Android的SELinux失败。

因此,为了继续执行Android的SELinux分析任务,我们将不得不以最干净的方式来解决问题:

  • 首先,我们将建立一个理智的环境,
  • 完成此操作后,我们将编译Android的SELinux库和第一个工具,
  • 在它们之上,我们将构建SELinux工具,
  • 我们将通过添加一些补充实用程序来结束。

设置适当的环境

环境特性

推荐的最干净的一种可能唯一可靠的工作方式是为Android工作提供专用的环境:

  • 虚拟机非常好(如果不是最佳选择)。最好使用VMware,因为您必须通过USB将手机连接到来宾系统。免费的替代Qemu似乎不能很好地处理此类任务。我没有尝试使用其他虚拟化软件。

  • 它必须是64位系统,否则由于整数大小错误,代码将根本无法编译。

  • 这是强烈推荐,可能是强制性的,使用Ubuntu系统。如果您更喜欢XFCE的更轻便的桌面环境,请随意使用Xubuntu,这不会改变系统的核心和可用软件包,并且不会影响您与Android相关的工作(我在此过程中对Ubuntu所做的任何陈述也适用于Xubuntu)。您可能会在Android的SELinux源代码树中找到一些建议使用Fedora的自述文件,这些文件是从上游NSA的SELinux项目继承而来的,其内容不一定与Google的Android相匹配。

  • 要使用的Unbuntu的确切版本取决于您要构建的Android版本。对于Android 6.0,建议使用Ubuntu 14.04(Trusty)。查看Google要求页面以获取更多信息。

  • 您将需要大量的磁盘空间(如果仅计划与SELinux相关的调查,则至少需要50GB;如果计划完整的Android版本,则至少需要100GB)。CPU和内存的相关性较小,它们仅影响完整构建的时间,而对SELinux相关任务没有实际影响。

使用Ubuntu具有两个主要优点:

  • 通过使用推荐的系统,您正在一个众所周知且经过测试的环境中工作:系统库,工具和软件包位于项目期望的版本和位置。

  • 更具体地说,在我们当前的情况下:Ubuntu本身依赖于AppArmor,它是SELinux的替代品,它不使用SELinux。好消息是,您将因此可以在系统范围内安装Android的SELinux工具和二进制文件,而不必担心会改变系统的可靠性。

环境安装步骤

您可以从完整的实时DVD开始以传统方式安装Ubuntu,但是更快的替代方法是使用netboot安装(文本模式安装)并最后选择您喜欢的桌面环境。这样做将直接安装最新的软件包版本,而不是先安装过时的软件包版本,然后要求在首次启动时应用389个挂起的更新,从而节省了初始更新时间。

此处提供适用于Ubuntu / Xubuntu 14.04的ISO(相同的ISO)netboot安装程序。

要跳过VMware麻烦的“轻松安装”功能,请先选择“以后再安装操作系统”选项,这是一个好习惯。

确保选择Linux,然后选择Ubuntu 64位作为来宾OS。

VM将需要以下资源:

  • 强制性:磁盘空间必须至少是 40GB(默认20 GB会不会是不够的,源代码本身就需要比这更多的空间),推荐使用更高。完整版本至少需要100 GB磁盘,这是我通常采用的值。不要忘记此设置只是一个最大限制:VM的实际大小会根据来宾的请求而动态增长。
  • 理想的:将RAM从1024增加到至少2048或更高(取决于您的主机容量,我使用4096),
  • 功能性的:将处理器核心的数量从1增加到2或更高(取决于您的主机容量,我使用3)。
  • 光盘必须指向安装ISO文件。
  • 您可能需要将USB从默认的1.1切换到2.0,因为连接设备时前者可能会发出警告。根据您的使用情况,您还可以安全地取消选中“自动连接新的USB设备”“与虚拟机共享蓝牙设备”
  • 根据您的环境,您可能还需要调整显示设置(禁用3D,强制设置屏幕大小)。

注意:

  • 如果选择了netboot安装,请在进入“ 软件选择”屏幕时不要忘记选择桌面环境(Ubuntu桌面Xubuntu桌面),否则最终将获得最小的纯文本环境!
  • 第一次启动时,请拒绝升级到最新版本:这里的重点是保持在14.04中!

首次启动时,您可能要执行的第一个操作是安装Linux来宾工具:

sudo apt-get install open-vm-tools

该数据包放置了启动时触发器,因此,只有在客户机重新启动后,它的安装才会完成。

获取Android源代码

尽管类似,但过程详细信息取决于所选的ROM:

  • 对于CyanogenMod,搜索您的设备(首先选择供应商),然后单击“如何构建CyanogenMod”链接以获取适用于您设备的说明。
  • 对于AOSP,请遵循从此处开始的过程。

值得注意的是CyanogeMod在其源代码树中捆绑了一个允许您解压缩boot.img文件的工具。换句话说,CyanogenMod提供了一个工具,使您可以访问sepolicy存储在设备和ROM归档文件中的文件。Google的AOSP不提供此类工具,因此,如果没有其他必要,使用CyanogenMod的源代码树可能是最方便的选择,否则您将不得不安装appart(这是快速简便的操作,因此在这里不必担心)。

在这里,我正在遵循CyanogenMod 13.0(Android 6.0)过程。上面链接的页面上提供了有关所使用命令的说明。请阅读它们,下面的打字稿仅供参考。

提示:虽然我apt-get在这篇文章中使用的是最低限度的公分母,并使每个人都满意,但您可能更喜欢使用aptitude它,因为这样可以更好地处理依赖项(在删除需要安装某些依赖项的软件包时) ,这些依赖项也将被删除,使您的系统更加整洁。AFAIK该aptitude命令必须安装在Ubuntu中,但默认情况下在Xubuntu上可用。

sudo apt-get install bison build-essential curl flex git gnupg gperf \
libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libwxgtk2.8-dev libxml2 \
libxml2-utils lzop maven openjdk-7-jdk pngcrush schedtool squashfs-tools \
xsltproc zip zlib1g-dev g++-multilib gcc-multilib lib32ncurses5-dev \
lib32readline-gplv2-dev lib32z1-dev
mkdir -p ~/bin
mkdir -p ~/android/system
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod u+x ~/bin/repo
cd ~/android/system/
git config --global user.name "Your Name"
git config --global user.email "you@example.com
repo init -u https://github.com/CyanogenMod/android.git -b cm-13.0
repo sync
# Coffee time: around 20GB are being downloaded, this may take several hours.
source ./build/envsetup.sh
breakfast

现在,您有了干净且几乎完整的源代码树。专有的blob丢失了,但是您不需要SEBL相关的任务。

提示:获取源代码是一个繁琐的过程,现在值得对VM进行快照或备份。

编译并安装Android的SELinux工具集和库

现在,旅行的有趣部分开始了;)!

到目前为止,该过程应该非常简单。目的主要是确保您拥有与我相同的环境。如果这样做,续集也应该保持简单明了。

在后台,Google会毫不犹豫地在版本之间对Android的源代码进行重大更改,因此确切的编译步骤肯定会取决于版本(例如AOSP主站显示sepolicy/目录将被移动)。

我将首先分享编译和安装Android的SElinux库和工具集的确切过程,但是为了保持本文的实用性,我将添加一些有关通用方法的注释,以解决大多数编译问题。

分步程序

Android的SELinux库提供了抽象层,该层将允许上层软件处理特定于Android的SELinux策略文件。因此,我们需要首先编译并安装它们(如果遇到困难,它实际上代表了核心,直到您找到自己的方式为止)。

然后,我们将能够构建和安装SELinux工具。正如我们将看到的,幸运的是,这些不需要特定于Android,它们只需要匹配SELinux库版本。

此过程已使用CyanogenMod和AOSP源代码树进行了测试。

编译并安装Android SELinux库和第一个工具

首次安装依赖项:

sudo apt-get install libapol-dev libaudit-dev libdbus-glib-1-dev libgtk2.0-dev \
libustr-dev python-dev python-networkx swig xmlto

在这篇文章中,变量$ANDROID_BUILD_TOP存储了您的源位置(发出repo sync命令的目录)。随意更改名称。

ANDROID_BUILD_TOP=~/android/system
cd $ANDROID_BUILD_TOP
source ./build/envsetup.sh

默认情况下,由于restorecond的Makefile无法找到某些库,因此策略核心utils编译失败。您必须编辑此Makefile才能使用动态生成的路径,pkg-config而不是使用硬编码的路径(不要将反引号与单引号引起混淆!):

sed -i 's/^CFLAGS ?= -g -Werror -Wall -W$/& `pkg-config --cflags --libs dbus-1 gtk+-2.0`/' \
$ANDROID_BUILD_TOP/external/selinux/policycoreutils/restorecond/Makefile

随时使用某些文本编辑器打开Makefile,以确保已正确考虑了修改。

现在编译并安装:

cd $ANDROID_BUILD_TOP/external/bzip2/
make -f Makefile-libbz2_so
sudo make install
cd $ANDROID_BUILD_TOP/external/libcap-ng/libcap-ng-0.7/
./configure
make
sudo make install
cd $ANDROID_BUILD_TOP/external/selinux/
make -C ./libsepol/
sudo make -C /libsepol/ install
EMFLAGS=-fPIC make -C ./libselinux/
sudo make -C ./libselinux/ install
make -C ./libsemanage/
sudo make -C ./libsemanage/ install
make
sudo make install
make swigify
sudo make install-pywrap
sudo cp ./checkpolicy/test/{dispol,dismod} /usr/bin/

注意:EMFLAGS=-fPIC构建时不要错过环境变量设置libselinux。它不会产生任何错误,但是在下一步中,您将无法构建SETools。如果您错过了它或做了其他任何错误,只需发出amake clean并重新开始编译。

编译并安装SELinux工具

SELinux工具以预先构建的形式提供,其中包括:

  • 该范围内的Python脚本(和他们的shell脚本包装)$ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/目录
  • 下面的Python包(包括*.o编译文件)$ANDROID_BUILD_TOP/prebuilts/python/linux-x86/2.7.5/lib/python2.7/site-packages/

我希望这些工具的源代码可以在下面获得$ANDROID_BUILD_TOP/external,但事实并非如此。实际上,我找不到任何地方与Google共享他们使用的SETools的确切版本(仅供参考,GPL仅要求共享修改后的代码),因此我们将不得不猜测并尝试并尽力而为。

这些工具本身是Python脚本,这是SETools 4(在SETools 3中,sesearch是用C进行二进制可执行代码编码的命令)的新改进。但是,这些工具本身仍显示3.3.8的版本:

$ $ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/sesearch --version
3.3.8

因此,我的猜测是Google从SETools 4中获取了一些早期开发快照。直到4.0.0 beta SETools依赖于libsepolversoin 2.4,随着4.0.0版本的发布,他们开始依赖与该库版本不兼容的该库的2.5版。 SELinux捆绑在Android 6.0中(您可以尝试对其进行编译,否则将失败)。

因此,最明智的选择似乎是使用SETools 4.0.0 Beta。

安装补充依赖项:

sudo apt-get install python-setuptools

下载并提取源代码:

cd ~/android/
wget https://github.com/TresysTechnology/setools/archive/4.0.0-beta.tar.gz
tar xzf 4.0.0-beta.tar.gz
cd ./setools-4.0.0-beta/

由于影响Flex 2.5 的错误,我们需要-Wredundant-decls从编译器的标志中删除:

sed -i '/-Wredundant-decls/d' ./setup.py

最后编译安装:

python ./setup.py build
sudo python ./setup.py install

通用程序(或“如何解开自己”)

如果上述步骤在您的情况下不起作用,则这是有关如何尝试进行操作的更高级别的视图。

令人遗憾的是,这里没有任何魔术(也没有helper :():可以编译此代码的唯一方法是经典而又令人恐惧的循环“试用”方法。

尝试第一次编译,由于*.h找不到某些文件,很可能会失败:

  1. 在Android external/目录中搜索:

    find $ANDROID_BUILD_TOP/external -name filename.h
    

    如果找到请求的文件,则意味着相应的库或工具的特定版本已捆绑在Android源代码中。因此,您不应尝试从Ubuntu的软件包系统中安装它,而应编译并安装Android源代码中捆绑的版本。

    请注意,这与您在论坛上可能会发现的一般建议背道而驰:“由于缺少该库,您的编译失败了?安装此软件包就可以了!” ,这样做您很可能只会遇到更糟糕的问题:如果捆绑了特定版本,则最有可能是因为需要特定版本(由于兼容性问题或此版本包含Google的特定更改)。

    顺便说一句,如果您想知道:当然,由于*.h找不到某些文件,此库或工具也可能具有依赖项引发错误,是的,您应该应用这种非常相同的循环“尝试-看”方法。

  2. 全系统搜索:

    find / -name filename.h 2>/dev/null
    

    如果您发现“丢失”该文件的某个标准共享库位置中已经存在于系统中,则意味着您的环境中可能已经满足了这种依赖性,但是引发错误的Makefile太笨了,找不到它。

    如果您手动直接调用此Makefile,则可能可以设置一些解决此问题的环境变量(LIBDIR=/usr/lib make例如),否则,您可能需要修改Makefile本身(该pkg-config命令可能对自动生成丢失的构建参数很有帮助) 。

  3. 在包装系统中搜索:

    apt-cache search filename-dev
    

    其中filename-dev以小写形式表示丢失文件的名称,后缀.h-dev后缀替换(例如,如果Python.h未找到,请搜索python-dev)。可能需要对确切名称进行一些调整才能找到正确的程序包。

  4. 如果您仍然呆滞,甚至在Internet上进行快速搜索都无法提供明确的答案,那么apt-file您将是最好的朋友。apt-file默认情况下未安装,您需要安装它并生成其数据库:

    sudo apt-get apt-file
    sudo apt-file update
    

    apt-file允许您搜索提供特定文件的软件包(甚至是已卸载的软件包)。为避免产生太多结果,建议将其与grep以下内容关联:

    apt-file search filename.h | grep -w filename.h
    

    如果Ubuntu的存储库中有一个提供此文件的软件包,则apt-file应该能够找到它。

    找到正确的软件包后,请使用apt-get install packagenamewhere packagename软件包名称安装它。

提示:如果您的系统上拧东西,命令重新安装包是这个:apt-get reinstall pkg_name。即使由于破坏依赖关系而无法进行经典的删除和安装(这对于系统的库来说很可能)时,它也将起作用。

辅助工具

在这一步,您现在应该拥有一个干净的环境,使您可以研究编译格式和源格式的Android SELinux规则。

但是,最有可能的是,在调查结束时,您将希望采取一些措施。以当前形状,您的环境将不允许您修改设备的sepolicy文件。实际上,不能轻易替换此文件:它是设备根目录的一部分,并且根目录的内容在启动时是从RAM磁盘文件中提取的,而RAM磁盘文件又存储在设备的启动映像中。

因此,在环境完成之前,您仍然会错过两件事:

  • 一种访问和修改设备启动映像的方法,
  • 一种修改其sepolicy文件的方法。

幸运的是,这些正是本文最后两个部分的主题!:)

获取并更新设备的启动映像

除了篡改SELinux规则外,用于获取和更新设备启动映像的工具还可以用于多种用途。因此,我创建了一个专用的答案,请参考它。

修改设备的SELinux规则

这里有两种主要的可能性:

  • sepolicy根据您的源树中的规则构建一个新文件(搜索.te文件以找到它们:find $ANDROID_BUILD_TOP -name \*.te,它们分散在多个目录中)。
  • 修改sepolicy设备当前使用的文件。

除非您真的需要从头开始构建规则(这更多是与开发相关的任务,因此不在本文范围内),否则第二选择似乎是最安全的选择,因为您确定唯一的更改将是您所做的更改。明确提出。

有一个项目正在制作一个工具,使您可以将sepolicy文件反编译为可重新编译的形式,从而可以自由地编辑它们之间的规则。但是,该项目已在概念验证状态下被放弃。您将在此博客文章的末尾找到所有信息,本文的其余部分包含足够的详细信息,以允许其他有兴趣的人接手。

当前推荐的更改sepolicy规则的方法采用另一种方法:直接修改sepolicy二进制文件。sepolicy-inject工具允许这样做,并且会得到积极维护。

为了完整起见,请注意该工具的一个分支。它增加了一些功能,其中一些功能在原始作者的工作清单上(例如删除规则的可能性),不要问我为什么他们选择分叉而不是做出贡献...

要编译和安装sepolicy-inject,只需按以下步骤操作:

cd ~/android/
git clone https://bitbucket.org/joshua_brindle/sepolicy-inject.git
cd ./sepolicy-inject/
LIBDIR=/usr/lib make
sudo cp ./sepolicy-inject /usr/bin/

用例示例

举例来说,假设您要添加与以下错误消息匹配的自动查询:

avc: denied { read } for pid=128 comm="file-storage"
path="/data/media/0/path/to/some/file"
dev="mmcblk0p28" ino=811035 scontext=u:r:kernel:s0
tcontext=u:object_r:media_rw_data_file:s0 tclass=file permissive=0

您将需要获取设备的启动映像,然后将其解压缩以访问其sepolicy文件。

使用进行的快速检查sesearch显示,确实没有允许规则(尚未!):

$ sesearch -A -s kernel -t media_rw_data_file -c file -p read ./sepolicy
$

该命令没有输出。

然后,使用下面的命令添加所需的规则(注意sesearchsepolicy-inject参数之间的相似性):

sepolicy-inject -s kernel -t media_rw_data_file -c file -p read -P ./sepolicy

现在我们可以回叫我们的sesearch命令:

$ sesearch -A -s kernel -t media_rw_data_file -c file -p read ./sepolicy
allow kernel media_rw_data_file:file read;
$

sesearch 输出显示该策略已正确更新。

现在,您可以重新打包设备的boot.img文件并将其闪回设备。检查文件的最后修改时间/sepolicy是确保您的设备现在正在运行新更新的sepolicy文件的简便方法。

结论

您现在应该拥有一个完整的环境,可以自由检查和修改Android设备的SELinux策略。请享用!:)

附带说明一下,还有一些工具可以直接从设备分析和修改SELinux策略。


1
只是一个注意事项-除非您喝了很多咖啡,否则切勿执行“ repo sync”;)改用“ repo sync -q -f --force-sync -c”-这样可以节省大量时间和硬盘空间。-q是安静的,-f和--force-sync将在出现临时网络错误时帮助您继续操作,-c仅获取当前分支。PS我在开发期间还需要完全擦除任何本地更改并切换到清单版本时,也使用“ -d --prune”标志。
Oleksandr

@Oleksandr:感谢您提供信息,这对您很有帮助。我使用该-c标志进行了测试,但没有发现任何大的区别:仍然有尽可能多的数据可供计算机下载(25 GB),仍然有足够的咖啡因供我饮用;)。我对该-f标志有些警惕,因为据我所知repo,当它未能下载部分源代码并且仍将最终结果视为成功时,将不得不忽略该标志。我更喜欢将“成功”状态保留为完整获取,并且避免发现自己处于未知情况下,文件可能会随机丢失。
WhiteWinterWolf

2

您应该首先从AOSP代码构建旧版本的libsepol(例如与6.0版本相对应的版本),然后针对它链接sepolicy-inject,dispol等。此食谱对debian jessie有用:

cd /to/the/aosp/dir 
[repo init, etc]
repo sync external/selinux
cd external/selinux
git checkout android-6.0.0_r1^
cd libsepol
make
libsepol=`pwd`
cd /to/the/selinux-inject-source-dir
make LIBDIR=$libsepol

与针对系统libsepol链接的sepolicy-inject不同,此选项可与android sdk中包含的6.0映像中的/ sepolicy配合使用:

$ sepolicy-inject -Z shell -P /tmp/sepolicy -o /tmp/sepolicy 
libsepol.policydb_read: policydb version 30 does not match my version range 15-29
error(s) encountered while parsing configuration
Could not load policy
$ ./sepolicy-inject -Z shell -P /tmp/sepolicy -o /tmp/sepolicy 
libsepol.policydb_index_others: security:  1 users, 2 roles, 525 types, 0 bools
libsepol.policydb_index_others: security: 1 sens, 1024 cats
libsepol.policydb_index_others: security:  87 classes, 4767 rules, 0 cond rules

对于selinux发行版中包含的工具,诀窍是使用相同的DESTDIR构建它们:

cd libsepol
make DESTDIR=/some/dir install
cd ../checkpolicy
make DESTDIR=/some/dir
# here you have a working 'dispol' in the 'test' subdir

谢谢。这给了我一个似乎有效的sedispol版本,但我仍然无法编译sesearch。Sesearch死于寻找包含文件<apol/policy.h>(从另一个policy.h文件中)。您知道哪个模块包含apol吗?
user3188445

@ user3188445:该文件apol/policy.h由软件包提供libapol-dev(至少在Ubuntu系统上是该文件)。请参阅我的答案以获取更多详细信息。
WhiteWinterWolf

1

对于面临此问题的人们:

policydb version 30 does not match my version range 15-29

同时使用AOSP代码。

假设您的AOSP代码已签出到〜/ android / source目录:

cd ~/android/source
source build/envsetup.sh
export ANDROID_BUILD_TOP=$(pwd)

现在,您可以自由使用捆绑的audit2allow实用程序:

./external/selinux/prebuilts/bin/audit2allow

PS另外,我想发表评论检查android(v30)selinux政策

Sesearch死于寻找包含文件(从另一个policy.h文件中)。您知道哪个模块包含apol吗?

https://github.com/SELinuxProject/selinux来源构建selinux工具包并非易事(除非您正在使用Fedora)。在Ubuntu上,您需要安装(假设您已经安装了像bison和C编译器这样的基本开发工具)libglib2.0-dev,libcap-ng-dev,xmlto,libsemanage1-dev,libustr-dev,libaudit-dev,libsepol1 -dev

但是最后,由于https://bugs.launchpad.net/ubuntu/+source/glib2.0/+bug/793155,我仍然无法编译它,并且不知道如何解决它


1
我还遇到glibconfig.h了您在文章末尾链接的错误,它是由restorecondMakefile 引发的,因为其中错误地编码了错误的路径。您必须对其进行修改,以使其使用来动态解析路径pkg-config。请参阅我的答案以获取更多详细信息。
WhiteWinterWolf


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.