Skip to content

Commit f345894

Browse files
committedDec 24, 2024·
feat(core.manager): 大于API 33,安装插件时,禁止插件文件可写入
由于插件apk都是BasePluginManager负责解压缩的,所以它应该负责它们禁止可写。 但是PluginManager本身的apk更新应该由更新文件的代码本身禁止文件可写入。 #1344
1 parent ca102fa commit f345894

File tree

4 files changed

+36
-0
lines changed

4 files changed

+36
-0
lines changed
 

‎projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/manager/FixedPathPmUpdater.java

+8
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
package com.tencent.shadow.sample.host.manager;
2020

21+
import android.os.Build;
22+
2123
import com.tencent.shadow.dynamic.host.PluginManagerUpdater;
2224

2325
import java.io.File;
@@ -29,6 +31,12 @@ public class FixedPathPmUpdater implements PluginManagerUpdater {
2931

3032
FixedPathPmUpdater(File apk) {
3133
this.apk = apk;
34+
35+
//在API 33以上的系统上,禁止动态加载文件可写入,满足系统安全限制
36+
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) {
37+
//noinspection ResultOfMethodCallIgnored
38+
apk.setWritable(false);
39+
}
3240
}
3341

3442

‎projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/BasePluginManager.java

+16
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,25 @@ public final void onInstallCompleted(PluginConfig pluginConfig,
136136
String oDexDir = ODexBloc.isEffective() ?
137137
AppCacheFolderManager.getODexDir(root, pluginConfig.UUID).getAbsolutePath() : null;
138138

139+
//在API 33以上的系统上,禁止动态加载文件可写入,满足系统安全限制
140+
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) {
141+
setWritableFalseForPluginFiles(pluginConfig);
142+
}
143+
139144
mInstalledDao.insert(pluginConfig, soDirMap, oDexDir);
140145
}
141146

147+
private static void setWritableFalseForPluginFiles(PluginConfig pluginConfig) {
148+
List<PluginConfig.FileInfo> list = new ArrayList<>();
149+
list.add(pluginConfig.pluginLoader);
150+
list.add(pluginConfig.runTime);
151+
list.addAll(pluginConfig.plugins.values());
152+
for (PluginConfig.FileInfo fileInfo : list) {
153+
//noinspection ResultOfMethodCallIgnored
154+
fileInfo.file.setWritable(false);
155+
}
156+
}
157+
142158
protected InstalledPlugin.Part getPluginPartByPartKey(String uuid, String partKey) {
143159
InstalledPlugin installedPlugin = mInstalledDao.getInstalledPluginByUUID(uuid);
144160
if (installedPlugin == null) {

‎projects/test/dynamic/host/test-dynamic-host/src/main/java/com/tencent/shadow/test/dynamic/host/PluginHelper.java

+4
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ public void run() {
7575
private void preparePlugin() {
7676
try {
7777
InputStream is = mContext.getAssets().open(sPluginManagerName);
78+
79+
//noinspection ResultOfMethodCallIgnored
80+
pluginManagerFile.setWritable(true);
81+
7882
FileUtils.copyInputStreamToFile(is, pluginManagerFile);
7983

8084
InputStream zip = mContext.getAssets().open(sPluginZip);

‎projects/test/dynamic/host/test-dynamic-host/src/main/java/com/tencent/shadow/test/dynamic/host/manager/FixedPathPmUpdater.java

+8
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
package com.tencent.shadow.test.dynamic.host.manager;
2020

21+
import android.os.Build;
22+
2123
import com.tencent.shadow.dynamic.host.PluginManagerUpdater;
2224

2325
import java.io.File;
@@ -29,6 +31,12 @@ public class FixedPathPmUpdater implements PluginManagerUpdater {
2931

3032
FixedPathPmUpdater(File apk) {
3133
this.apk = apk;
34+
35+
//在API 33以上的系统上,禁止动态加载文件可写入,满足系统安全限制
36+
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) {
37+
//noinspection ResultOfMethodCallIgnored
38+
apk.setWritable(false);
39+
}
3240
}
3341

3442

0 commit comments

Comments
 (0)
Please sign in to comment.