Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

模块不生效与 Shamiko 白名单模式共存方法 #6

Open
shenghuang147 opened this issue Aug 21, 2024 · 1 comment
Open

模块不生效与 Shamiko 白名单模式共存方法 #6

shenghuang147 opened this issue Aug 21, 2024 · 1 comment

Comments

@shenghuang147
Copy link

shenghuang147 commented Aug 21, 2024

开启本 ISSUES 的原因

因为本人遇到了这个问题,发现无论在讨论群里还是此储存库,都没人讨论过这个问题,且这里没有 Discussions 版块,故此借用 ISSUES 版块说一下我的解决方法,以便协助后来人。

本人环境说明

  • 系统版本: MIUI 14.0.2.0
  • 安卓版本: Android 13
  • Magisk-ProxyPinCA版本: 1.2.0 (Magisk内模块显示的版本号)

如果你使用了 Shamiko 的白名单模式,那么该模块将可能不生效,即便该模块已经成功地在 /system/etc/security/cacerts 中安装了证书,您在系统证书中也看不到 ProxyPin CA 这个证书
(这个问题网络上讨论得比较少,不确定是只在 MIUI14 上有还是因为使用 Shamiko 的白名单模式的人少)

解决方法

方法1:

  • 关闭 Shamiko 模块或者不使用白名单模式

方法2:

  • /system/etc/security/cacerts 挂在到 tmpfs
  • 你可以将自定义的挂载脚本放到 /data/adb/post-fs-data.d 目录下并赋予可执行权限。或者将该模块的 post-fs-data.sh 修改为以下内容
#!/system/bin/sh


exec > /data/local/tmp/ProxyPinCA.log
exec 2>&1

#set -x

MODDIR=${0%/*}

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

    default_selinux_context=u:object_r:system_file:s0
    selinux_context=$(ls -Zd $1 | awk '{print $1}')

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

#LOG_PATH="/data/local/tmp/ProxyPinCA.log"
echo "[$(date +%F) $(date +%T)] - ProxyPinCA post-fs-data.sh start."
chown -R 0:0 ${MODDIR}/system/etc/security/cacerts
if [ -d /apex/com.android.conscrypt/cacerts ]; then
    # 检测到 android 14 以上,存在该证书目录
    CERT_HASH=243f0bfb

    CERT_FILE=${MODDIR}/system/etc/security/cacerts/${CERT_HASH}.0
    echo "[$(date +%F) $(date +%T)] - CERT_FILE: ${CERT_FILE}"
    if ! [ -e "${CERT_FILE}" ]; then
        echo "[$(date +%F) $(date +%T)] - ProxyPinCA certificate not found."
        exit 0
    fi

    TEMP_DIR=/data/local/tmp/cacerts-copy
    rm -rf "$TEMP_DIR"
    mkdir -p -m 700 "$TEMP_DIR"
    mount -t tmpfs tmpfs "$TEMP_DIR"

    # 复制证书到临时目录
    cp -f /apex/com.android.conscrypt/cacerts/* "$TEMP_DIR"
    cp -f $CERT_FILE "$TEMP_DIR"

    chown -R 0:0 "$TEMP_DIR"
    set_context /apex/com.android.conscrypt/cacerts "$TEMP_DIR"

    # 检查新证书是否成功添加
    CERTS_NUM="$(ls -1 "$TEMP_DIR" | wc -l)"
    if [ "$CERTS_NUM" -gt 10 ]; then
        mount -o bind "$TEMP_DIR" /apex/com.android.conscrypt/cacerts
         for pid in 1 $(pgrep zygote) $(pgrep zygote64); do
            nsenter --mount=/proc/${pid}/ns/mnt -- \
                mount --bind "$TEMP_DIR" /apex/com.android.conscrypt/cacerts
        done
        echo "[$(date +%F) $(date +%T)] - Mount success!"
    else
        echo "[$(date +%F) $(date +%T)] - Mount failed!"
    fi

    # 卸载临时目录
    umount "$TEMP_DIR"
    rmdir "$TEMP_DIR"
else
    echo "[$(date +%F) $(date +%T)] - Android version lower than 14 detected"
    TEMP_DIR="/data/local/tmp/cacerts-copy"
    SYSTEM_CACERTS_DIR="/system/etc/security/cacerts"
    IMPORT_CA_DIR=${MODDIR}/system/etc/security/cacerts

    rm -rf "$TEMP_DIR"
    mkdir -p -m 700 $TEMP_DIR
    # 复制系统证书到临时目录
    cp $SYSTEM_CACERTS_DIR/* $TEMP_DIR
    # 复制 ProxyPin 证书到临时目录
    cp $IMPORT_CA_DIR/* $TEMP_DIR/
    set_context $SYSTEM_CACERTS_DIR "$TEMP_DIR"
    # 将 /system/etc/security/cacerts 挂载到 tmpfs
    mount -t tmpfs tmpfs $SYSTEM_CACERTS_DIR
    chown -R 0:0 $TEMP_DIR
    chmod -R 644 $TEMP_DIR
    # 将临时目录中的证书移动到 系统证书目录
    mv $TEMP_DIR/* $SYSTEM_CACERTS_DIR/
    echo "[$(date +%F) $(date +%T)] - Mount success!"
fi

if [ $(id -u) -ne 0 ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

不知道有没有办法判断 Shamiko 模块起否启用,如果有的话可以改进脚本,如果有知道的欢迎补充

方法3:

  • 给进程单独挂证书,这个我不会,我只成功且正常运行过一次。无法确定我成功的那一次是挂给哪几个进程。后面尝试了几次都不行,如果有大佬了解请帮忙补充。
  • 参考: issuecomment-1641430409

参考链接

Dr-TSNG/ZygiskNext#39 (comment)
https://www.lategege.com/?p=1452
mitmproxy/mitmproxy#6460

如果有更好的解决办法也欢迎各位告知我。

@wanghongenpin
Copy link
Owner

这里也有相关讨论,可以整合到一起,我加个置顶
wanghongenpin/proxypin#200

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants