Skip to content

Commit d8034b7

Browse files
committed
add: Magisk Kitsune SuList support
This commit adds support for the Kitsune SuList, a denylist in whitelist mode.
1 parent 3605857 commit d8034b7

1 file changed

Lines changed: 29 additions & 3 deletions

File tree

zygiskd/src/root_impl/magisk.c

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ char *magisk_managers[] = {
3131
enum magisk_variants variant = Official;
3232
/* INFO: Longest path */
3333
static char path_to_magisk[sizeof(DEBUG_RAMDISK_MAGISK)];
34+
bool is_using_sulist = false;
3435

3536
void magisk_get_existence(struct root_impl_state *state) {
3637
struct stat s;
@@ -78,7 +79,7 @@ void magisk_get_existence(struct root_impl_state *state) {
7879
strcpy(path_to_magisk, SBIN_MAGISK);
7980
}
8081

81-
char *argv[] = { "magisk", "-v", NULL };
82+
char *argv[4] = { "magisk", "-v", NULL, NULL };
8283

8384
char magisk_info[128];
8485
if (!exec_command(magisk_info, sizeof(magisk_info), (const char *)path_to_magisk, argv)) {
@@ -113,6 +114,27 @@ void magisk_get_existence(struct root_impl_state *state) {
113114
return;
114115
}
115116

117+
/* INFO: Magisk Kitsune has a feature called SuList, which is a whitelist of
118+
which processes are allowed to see root. Although only Kitsune has
119+
this option, there are Kitsune forks without "-kitsune" suffix, so
120+
to avoid excluding them from taking advantage of that feature, we
121+
will not check the variant.
122+
*/
123+
argv[1] = "--sqlite";
124+
argv[2] = "select value from settings where key = 'sulist' limit 1";
125+
126+
char sulist_enabled[32];
127+
if (!exec_command(sulist_enabled, sizeof(sulist_enabled), (const char *)path_to_magisk, argv)) {
128+
LOGE("Failed to execute magisk binary: %s\n", strerror(errno));
129+
errno = 0;
130+
131+
state->state = Abnormal;
132+
133+
return;
134+
}
135+
136+
is_using_sulist = strcmp(sulist_enabled, "value=1") == 0;
137+
116138
if (atoi(magisk_version) >= MIN_MAGISK_VERSION) state->state = Supported;
117139
else state->state = TooOld;
118140
}
@@ -158,7 +180,10 @@ bool magisk_uid_should_umount(uid_t uid) {
158180
char *package_name = strtok(result + strlen("package:"), " ");
159181

160182
char sqlite_cmd[256];
161-
snprintf(sqlite_cmd, sizeof(sqlite_cmd), "select 1 from denylist where package_name=\"%s\" limit 1", package_name);
183+
if (is_using_sulist)
184+
snprintf(sqlite_cmd, sizeof(sqlite_cmd), "select 1 from sulist where package_name=\"%s\" limit 1", package_name);
185+
else
186+
snprintf(sqlite_cmd, sizeof(sqlite_cmd), "select 1 from denylist where package_name=\"%s\" limit 1", package_name);
162187

163188
char *const argv[] = { "magisk", "--sqlite", sqlite_cmd, NULL };
164189

@@ -169,7 +194,8 @@ bool magisk_uid_should_umount(uid_t uid) {
169194
return false;
170195
}
171196

172-
return result[0] != '\0';
197+
if (is_using_sulist) return result[0] == '\0';
198+
else return result[0] != '\0';
173199
}
174200

175201
bool magisk_uid_is_manager(uid_t uid) {

0 commit comments

Comments
 (0)