I've just been looking at this list of APIs for which we will be soon be required to declare a "required reason" in the app's privacy manifest:
One of the listed functions is stat()
.
The rationale seems to be that a malicious app can use stat to get the timestamps of files outside the app container, thereby "fingerprinting" the device.
The allowed reasons that we can declare are :
- To get timestamps that are displayed to the user.
- To get timestamps of files that are within the app's container.
- To get timestamps of files that the user has granted access to.
I am concerned that this does not include many of the legitimate non-timestamp uses of stat()
. For example, it can be used simply to test if a file exists, or to test whether a path refers to a file or a directory, or to check if two paths refer to the same file (e.g. via different symlinks), or to get the size of a file.
Some of these things can be achieved in other ways; for example, I can check if a file exists by trying to open()
it and checking for an error, and I can get the file size by opening it and calling lseek(SEEK_END)
. Maybe I can check if two paths are equivalent by using readlink()
to form canonical paths for both and comparing them. But I bet there are other things that can't be done.
I could probably fix all of my code to not call stat()
for non-timestamp reasons in a few hours. It would be more difficult to fix the various open-source libraries that I use.
What do you think we should all be doing?:
- "File a bug" asking for an additional reason for using
stat()
, i.e. to get non-timestamp information about files in the app's container. - Deliberately mis-read allowed reason C617.1, "to access the timestamps of files inside the app container", as " to access the timestamps and other metadata of files inside the app container", and declare that in the privacy manifest.
- Change code to not call
stat()
. - Any other suggestions?
P.S. I guess that libc++ std::filesystem calls stat()
. What is the status of using that? The std::filesystem functions that access file timestamps are not listed on the page linked above. If I call std::exists()
to check if a file exists, and assuming that is implemented using stat()
, will that trigger the new filter?