@@ -31,6 +31,7 @@ char *magisk_managers[] = {
3131enum magisk_variants variant = Official ;
3232/* INFO: Longest path */
3333static char path_to_magisk [sizeof (DEBUG_RAMDISK_MAGISK )];
34+ bool is_using_sulist = false;
3435
3536void 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
175201bool magisk_uid_is_manager (uid_t uid ) {
0 commit comments