防止路径操纵和操纵的可执行文件

时间:2018-06-29 15:07:21

标签: c# .net security

我有两个工具,它们由.NET应用程序初始化为一个进程。其中一些来自第三方。启动工具列表是可配置的。我想保护系统免于执行(恶意)修改的工具。

假设和可能的攻击媒介

我假设我的应用程序受操作系统(包括其配置文件)保护。但是,包含要启动的工具的文件夹为 not 。意味着攻击者理论上可以用名称相同的其他程序替换任何工具。

可能的解决方案

我当前的概念是将每个工具的SHA256哈希添加到配置中。假设我的应用程序和包含该列表的配置文件受到保护,这应该可以防止它们被操纵的应用程序替换。

实施示例

配置文件示例:

 <FileHashes>
    <Hashes>
      <add Filename="the-tool.exe" Hash="87BC21C157F7B3E4..." />
    </Hashes>
  </FileHashes>

应用示例:

public void Execute(FileInfo fileToLoad)
{           
    var hashDictionary = LoadHashDictionary();  //load hash from config          
    if (!hashDictionary.TryGetValue(fileToLoad.Name, out string configFileHash))
    {
        throw new Exception("Unknown file");
    }

    var fileHash = GetFileHash(fileToLoad);
    if (!configFileHash.ToUpperInvariant().Equals(fileHash))
    {
        throw new Exception("File is manipulated");
    }

    Process.Start(new ProcessStartInfo()
    {
        FileName = fileToLoad.FullName
    });
}

public string GetFileHash(FileInfo fileToLoad)
{            
    using (var fileStream = new FileStream(fileToLoad.FullName, FileMode.Open))
    {
        using (var shaHash = SHA256.Create())
        {
            fileStream.Position = 0;
            byte[] hasValue = shaHash.ComputeHash(fileStream);
            return BitConverter.ToString(hasValue)
                               .Replace("-", string.Empty)
                               .ToUpperInvariant();
        }
    }
}

问题

  • 是否有更好的方法来防止应用程序级别的可操纵文件?
  • 假设配置文件不安全,因为它也被放置在理论上可以被攻击者访问的文件夹中。我可以在哪里放置应用程序白名单和哈希?

1 个答案:

答案 0 :(得分:0)

如您所说。 Confg文件也不安全。恶意应用程序可以一起修改您的工具+配置文件以掩盖自身。

有什么简单的方法可以防止这种情况发生?代码签名。

在从主应用程序启动工具之前,只需对所有工具进行签名并进行证书验证。