From ad7ddd5a02e3ae0bd6e57d2c9df7715425fe2fc0 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Thu, 7 Dec 2017 09:59:48 +0900 Subject: [PATCH] Reland "Prevent vendors from accessing private VNDK libs" This reverts commit 875fe42a81696f44cc03eeaa538f370b44639bb7. ... and fixes a bug that private VNDK libs are not accessible even to RenderScript framework libraries (such as libRS_internal.so). This is fixed by exceptionally allowing the private libs only to 'rs' namespace. Bug: 70260989 Bug: 70279973 Bug: 63878960 Test: Build for walleye and tested Photos edit. Test: other renderscript app (camerascript) works as well Merged-In: I3978cbe2e869f6a1c214c755ded038349bde7b6b Change-Id: I3978cbe2e869f6a1c214c755ded038349bde7b6b (cherry picked from commit 781c47f4da82062c5445d53064566673c70119ee) --- rootdir/Android.mk | 14 +++++++++++--- rootdir/etc/ld.config.txt.in | 28 +++++++++++++++++----------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/rootdir/Android.mk b/rootdir/Android.mk index aa970d6a7..c702d03ea 100644 --- a/rootdir/Android.mk +++ b/rootdir/Android.mk @@ -211,11 +211,17 @@ vndk_lib_dep := $(intermediates)/$(vndk_lib_md5).dep $(vndk_lib_dep): $(hide) mkdir -p $(dir $@) && rm -rf $(dir $@)*.dep && touch $@ -llndk_libraries := $(subst $(space),:,$(addsuffix .so,$(LLNDK_LIBRARIES))) +llndk_libraries := $(subst $(space),:,$(addsuffix .so,\ +$(filter-out $(VNDK_PRIVATE_LIBRARIES),$(LLNDK_LIBRARIES)))) -vndk_sameprocess_libraries := $(subst $(space),:,$(addsuffix .so,$(VNDK_SAMEPROCESS_LIBRARIES))) +private_llndk_libraries := $(subst $(space),:,$(addsuffix .so,\ +$(filter $(VNDK_PRIVATE_LIBRARIES),$(LLNDK_LIBRARIES)))) -vndk_core_libraries := $(subst $(space),:,$(addsuffix .so,$(VNDK_CORE_LIBRARIES))) +vndk_sameprocess_libraries := $(subst $(space),:,$(addsuffix .so,\ +$(filter-out $(VNDK_PRIVATE_LIBRARIES),$(VNDK_SAMEPROCESS_LIBRARIES)))) + +vndk_core_libraries := $(subst $(space),:,$(addsuffix .so,\ +$(filter-out $(VNDK_PRIVATE_LIBRARIES),$(VNDK_CORE_LIBRARIES)))) sanitizer_runtime_libraries := $(subst $(space),:,$(addsuffix .so,\ $(ADDRESS_SANITIZER_RUNTIME_LIBRARY) \ @@ -226,6 +232,7 @@ $(2ND_UBSAN_RUNTIME_LIBRARY) \ $(2ND_TSAN_RUNTIME_LIBRARY))) $(LOCAL_BUILT_MODULE): PRIVATE_LLNDK_LIBRARIES := $(llndk_libraries) +$(LOCAL_BUILT_MODULE): PRIVATE_PRIVATE_LLNDK_LIBRARIES := $(private_llndk_libraries) $(LOCAL_BUILT_MODULE): PRIVATE_VNDK_SAMEPROCESS_LIBRARIES := $(vndk_sameprocess_libraries) $(LOCAL_BUILT_MODULE): PRIVATE_LLNDK_PRIVATE_LIBRARIES := $(llndk_private_libraries) $(LOCAL_BUILT_MODULE): PRIVATE_VNDK_CORE_LIBRARIES := $(vndk_core_libraries) @@ -234,6 +241,7 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_PATH)/etc/ld.config.txt.in $(vndk_lib_dep) @echo "Generate: $< -> $@" @mkdir -p $(dir $@) $(hide) sed -e 's?%LLNDK_LIBRARIES%?$(PRIVATE_LLNDK_LIBRARIES)?g' $< >$@ + $(hide) sed -i -e 's?%PRIVATE_LLNDK_LIBRARIES%?$(PRIVATE_PRIVATE_LLNDK_LIBRARIES)?g' $@ $(hide) sed -i -e 's?%VNDK_SAMEPROCESS_LIBRARIES%?$(PRIVATE_VNDK_SAMEPROCESS_LIBRARIES)?g' $@ $(hide) sed -i -e 's?%VNDK_CORE_LIBRARIES%?$(PRIVATE_VNDK_CORE_LIBRARIES)?g' $@ $(hide) sed -i -e 's?%SANITIZER_RUNTIME_LIBRARIES%?$(PRIVATE_SANITIZER_RUNTIME_LIBRARIES)?g' $@ diff --git a/rootdir/etc/ld.config.txt.in b/rootdir/etc/ld.config.txt.in index f1e1d5357..3278ccf2f 100644 --- a/rootdir/etc/ld.config.txt.in +++ b/rootdir/etc/ld.config.txt.in @@ -87,6 +87,9 @@ namespace.rs.asan.permitted.paths = /data/asan/vendor/${LIB}:/vendor/${LIB}:/dat namespace.rs.links = default,vndk namespace.rs.link.default.shared_libs = %LLNDK_LIBRARIES%:%SANITIZER_RUNTIME_LIBRARIES% +# Private LLNDK libs (e.g. libft2.so) are exceptionally allowed to this +# namespace because RS framework libs are using them. +namespace.rs.link.default.shared_libs += %PRIVATE_LLNDK_LIBRARIES% namespace.rs.link.vndk.shared_libs = %VNDK_SAMEPROCESS_LIBRARIES% ############################################################################### @@ -120,28 +123,31 @@ additional.namespaces = system ############################################################################### # "default" namespace # -# Vendor-side code runs in this namespace. +# This is the default linker namespace for a vendor process (a process started +# from /vendor/bin/*). The main executable and the libs under /vendor/lib[64] +# are loaded directly into this namespace. However, other libs under the system +# partition (VNDK and LLNDK libraries) are not loaded here but from the +# separate namespace 'system'. The delegation to the system namespace is done +# via the 'namespace.default.link.system.shared_libs' property below. ############################################################################### namespace.default.isolated = true namespace.default.visible = true -namespace.default.search.paths = /vendor/${LIB}/hw:/vendor/${LIB}/egl:/vendor/${LIB}:/vendor/${LIB}/vndk${VNDK_VER}:/system/${LIB}/vndk${VNDK_VER}:/vendor/${LIB}/vndk-sp${VNDK_VER}:/system/${LIB}/vndk-sp${VNDK_VER} -namespace.default.permitted.paths = /vendor:/system/${LIB}/vndk${VNDK_VER}:/system/${LIB}/vndk-sp${VNDK_VER} +namespace.default.search.paths = /vendor/${LIB}/hw:/vendor/${LIB}/egl:/vendor/${LIB}:/vendor/${LIB}/vndk${VNDK_VER}:/vendor/${LIB}/vndk-sp${VNDK_VER} +namespace.default.permitted.paths = /vendor -namespace.default.asan.search.paths = /data/asan/vendor/${LIB}/hw:/vendor/${LIB}/hw:/data/asan/vendor/${LIB}/egl:/vendor/${LIB}/egl:/data/asan/vendor/${LIB}:/vendor/${LIB}:/data/asan/vendor/${LIB}/vndk${VNDK_VER}:/vendor/${LIB}/vndk${VNDK_VER}:/data/asan/system/${LIB}/vndk${VNDK_VER}:/system/${LIB}/vndk${VNDK_VER}:/data/asan/vendor/${LIB}/vndk-sp${VNDK_VER}:/vendor/${LIB}/vndk-sp${VNDK_VER}:/data/asan/system/${LIB}/vndk-sp${VNDK_VER}:/system/${LIB}/vndk-sp${VNDK_VER} -namespace.default.asan.permitted.paths = /data/asan/vendor:/vendor:/data/asan/system/${LIB}/vndk${VNDK_VER}:/system/${LIB}/vndk${VNDK_VER}:/data/asan/system/${LIB}/vndk-sp${VNDK_VER}:/system/${LIB}/vndk-sp${VNDK_VER} +namespace.default.asan.search.paths = /data/asan/vendor/${LIB}/hw:/vendor/${LIB}/hw:/data/asan/vendor/${LIB}/egl:/vendor/${LIB}/egl:/data/asan/vendor/${LIB}:/vendor/${LIB}:/data/asan/vendor/${LIB}/vndk${VNDK_VER}:/vendor/${LIB}/vndk${VNDK_VER}:/data/asan/vendor/${LIB}/vndk-sp${VNDK_VER}:/vendor/${LIB}/vndk-sp${VNDK_VER}:namespace.default.asan.permitted.paths = /data/asan/vendor:/vendor namespace.default.links = system -namespace.default.link.system.shared_libs = %LLNDK_LIBRARIES% +namespace.default.link.system.shared_libs = %LLNDK_LIBRARIES%:%VNDK_SAMEPROCESS_LIBRARIES%:%VNDK_CORE_LIBRARIES% ############################################################################### # "system" namespace # -# This is for vendor process to use LL-NDK in system partition. +# This namespace is where system libs (VNDK and LLNDK libs) are loaded for +# a vendor process. ############################################################################### namespace.system.isolated = false -namespace.system.search.paths = /system/${LIB} -namespace.system.permitted.paths = /system/${LIB} +namespace.system.search.paths = /system/${LIB}/vndk-sp${VNDK_VER}:/system/${LIB}/vndk${VNDK_VER}:/system/${LIB} -namespace.system.asan.search.paths = /data/asan/system/${LIB}:/system/${LIB} -namespace.system.asan.permitted.paths = /data/asan/system/${LIB}:/system/${LIB} +namespace.system.asan.search.paths = /data/asan/system/${LIB}/vndk-sp${VNDK_VER}:/system/${LIB}/vndk-sp${VNDK_VER}:/data/asan/system/${LIB}/vndk${VNDK_VER}:/system/${LIB}/vndk${VNDK_VER}:/data/asan/system/${LIB}:/system/${LIB}