UWP使用Win32 API访问文件夹权限被拒绝

3

我正在将libgit2移植到Git GUI for UWP。一个场景是让用户使用FolderPicker::PickSingleFolderAsync选择存储库文件夹,然后将其添加到FutureAccessList中,以便应用程序可以访问它进行通常的 Git 功能。问题在于底层 Git 代码严重依赖 Win32 API 文件和文件夹访问,如FindFirstFileMoveFileEx等,用于文件和文件夹的statopen等操作,应用程序尝试访问时会报告Permission denied。(该代码对应用程序本地存储中的文件夹有效。我还检查了通常的stdio只能在其中工作。不能在其中使用fopen)。

这个问题有可行的解决方案吗?权限不应该在不同支持的API之间得到尊重吗?也许我错过了什么?(我不敢尝试移植libgit2所需的所有POSIX。一方面,它保证是低效的。另一方面,它极易出错,例如编写与open兼容的mmap。)


尝试使用此帖子中的解决方案(https://dev59.com/-aDha4cB1Zd3GeqP8ADy),虽然它可能不完全适用于您。 - Peter Torr - MSFT
@PeterTorr-MSFT 感谢您的指引。不幸的是,这在原则上是可行的,但在我的情况下并没有太大帮助。问题在于,大多数需要文件访问的软件都是通过文件路径进行访问的。对于这种情况,libgit2 并没有提供通过文件夹句柄打开存储库的 API。除非我执行不希望执行的操作,即查找和重定向库正在使用的所有可能的 Win32 API,例如 MapViewOfFile 等,否则它将无法正常工作。 - An Hoa
明白了。这是当前平台已知的限制。 - Peter Torr - MSFT
@PeterTorr-MSFT 感谢您认可这个问题。如果Win32可以升级以无缝方式考虑StorageFile权限,那将是很棒的。(我的意思是当用户通过选择器选取Storage(File|Folder)时,应用程序应能够通过传统的API端点访问底层存储。) - An Hoa
你可以点赞 这个 UserVoice 请求 - Peter Torr - MSFT
1个回答

1

这是不可能实现的事情!

根据@RobCaplan https://blogs.msdn.microsoft.com/wsdevsol/2012/12/04/skip-the-path-stick-to-the-storagefile/ 的说法,微软的天才们发明了一个安全存储解决方案,既不是安全的,也不是向后兼容的,即使对开发者来说会更加简单:一旦用户授予应用程序StorageFolder,该应用程序就可以使用提供的StorageFile API对其进行破坏。以下是代码:

auto folderPicker = ref new Windows::Storage::Pickers::FolderPicker();
folderPicker->FileTypeFilter->Clear();
folderPicker->FileTypeFilter->Append("*");

create_task(folderPicker->PickSingleFolderAsync()).then([](Windows::Storage::StorageFolder^ folder)
{
    if (folder == nullptr)
        cancel_current_task();
    Windows::Storage::AccessCache::StorageApplicationPermissions::FutureAccessList->Add(folder);
    create_task(folder->GetItemsAsync()).then([](IVectorView<IStorageItem^>^ items)
    {
        // Delete the folder content or encrypt it and demand money
        auto iter = items->First();
        while (iter->HasCurrent)
        {
            create_task(iter->Current->DeleteAsync(StorageDeleteOption::PermanentDelete));
            iter->MoveNext();
        }
    });
});

将乐意清除不幸选择的文件夹。恶意应用程序甚至不需要使用Win32 API就可以做到这一点。从逻辑上讲,API不是安全问题的原因。现有的UWP Win32 API显然正确处理本地存储访问,因此支持在Win32 API中使用FutureAccessList应该只需要最小的努力;这种希望使UWP开发困难化的愿望必须是故意的。(毫无疑问,Centennial不会成功。没有人想从Win32的极大灵活性转移到UWP的监狱中。)
编辑:我应该写:
“以我所希望的方式实现这样的事情是不可能的!”
因为文章确实提供了一个快速而非常聪明的解决方案:
如果库没有这样的接口,您无法添加接口,则需要将StorageFile内容复制到应用程序数据文件夹(可能位于TemporaryFolder中),然后将临时副本的路径传递给库。
所以在我的情况下,每当用户选择一个存储库文件夹时,我可以将整个文件夹复制到本地存储,对其进行操作,然后将整个文件夹复制回其原始位置。当然,“我想要的方式”上面指的是更加高效的方式,您不需要来回复制东西。

你是对的。StoreApp / UWP应用程序使用“应用容器”完整性级别(IL)。通过使用此IL,操作系统可以为应用程序创建沙箱-应用程序无法访问开箱即用,就像这个问题一样。但是,对于百年纪念版,它使用“中等”完整性级别。此级别与普通win32应用程序相同。这意味着百年纪念版应用程序没有像UWP那样的沙箱。但是...但是...这也会导致安全风险。这是一把双刃剑... - Mamoru Satoh
1
正如我所写的,我认为API访问并不是安全问题。在最近的真实世界安全漏洞历史中,主要问题始终是用户现实生活使得无法同时实现易用性友好和安全性:通常,有人被愚弄了,他/她仍然可以在UWP中(例如,我可以更改上面的代码以成为勒索软件)。因此,Win32应用程序没有任何安全风险。(事实上,当涉及到C/C++时,大多数漏洞都来自缓冲区溢出,指针的固有危险。) - An Hoa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接