Skip to content

Для правильности работы safetynet перенесено всё в модуль! #70

Description

@Oleg-Skalskiy

#!/system/bin/sh

MODDIR=${0%/*}

Улучшение 1: Прячем лог в папку модуля.

Это убережет от "палева" перед античитами, которые мониторят /data/local/tmp/

exec > "${MODDIR}/adguardcert.log"
exec 2>&1

set -x

set_context() {
[ "$(getenforce)" = "Enforcing" ] || return 0

# Улучшение 2: Более правильный fallback-контекст для системных сертификатов
default_selinux_context="u:object_r:system_security_cacerts_file:s0"
selinux_context=$(ls -Zd "$1" 2>/dev/null | awk '{print $1}')

if [ -n "$selinux_context" ] && [ "$selinux_context" != "?" ]; then
    chcon -R "$selinux_context" "$2"
else
    chcon -R "$default_selinux_context" "$2"
fi

}

AG_CERT_HASH="0f4ed297"

Более надежное экранирование переменных

AG_CERT_FILE=$(ls /data/misc/user//cacerts-added/${AG_CERT_HASH}. 2>/dev/null | (IFS=.; while read -r left right; do echo $right $left.$right; done) | sort -nr | (read -r left right; echo $right))

if ! [ -e "${AG_CERT_FILE}" ]; then
echo "Certificate ${AG_CERT_HASH} not found. Exiting."
exit 0
fi

rm -f /data/misc/user//cacerts-removed/${AG_CERT_HASH}.

Поддержка Android 13 и ниже (классический Magisk-метод)

mkdir -p "${MODDIR}/system/etc/security/cacerts"
cp -f "${AG_CERT_FILE}" "${MODDIR}/system/etc/security/cacerts/${AG_CERT_HASH}.0"
chown -R 0:0 "${MODDIR}/system/etc/security/cacerts"
set_context /system/etc/security/cacerts "${MODDIR}/system/etc/security/cacerts"

Поддержка Android 14+ (Обход ограничений APEX)

if [ -d /apex/com.android.conscrypt/cacerts ]; then
# Улучшение 3: Используем защищенную директорию модуля вместо /data/local/tmp/
TMP_DIR="${MODDIR}/adg-ca-copy"

rm -rf "${TMP_DIR}"
mkdir -p "${TMP_DIR}"

# Монтируем tmpfs (RAM-диск) прямо в папку модуля
mount -t tmpfs tmpfs "${TMP_DIR}"
cp -f /apex/com.android.conscrypt/cacerts/* "${TMP_DIR}/"

# Инжектим сертификат AdGuard
cp -f "${AG_CERT_FILE}" "${TMP_DIR}/${AG_CERT_HASH}.0"
chown -R 0:0 "${TMP_DIR}"
set_context /apex/com.android.conscrypt/cacerts "${TMP_DIR}"

CERTS_NUM="$(ls -1 "${TMP_DIR}" | wc -l)"
if [ "$CERTS_NUM" -gt 10 ]; then
    # Биндим в текущем пространстве имен
    mount --bind "${TMP_DIR}" /apex/com.android.conscrypt/cacerts
    
    # Улучшение 4: Пробрасываем mount --bind во все изолированные пространства Zygote
    # pgrep zygote захватывает и zygote, и zygote64, что делает код чуть лаконичнее
    for pid in 1 $(pgrep zygote); do
        nsenter --mount=/proc/${pid}/ns/mnt -- \
            mount --bind "${TMP_DIR}" /apex/com.android.conscrypt/cacerts 2>/dev/null
    done
else
    echo "Cancelling replacing CA storage due to safety check (certs count: $CERTS_NUM)"
fi

# Убираем за собой: отмонтируем tmpfs от папки модуля. 
# Сами сертификаты останутся наложенными на APEX благодаря mount --bind.
umount "${TMP_DIR}"
rmdir "${TMP_DIR}" 2>/dev/null

fi

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions