Прочитать на английском

Поделиться через


Безопасность и конфликты

Еще одной проблемой является потенциал для дыр безопасности, эксплуатируемых условиями гонки. Существует несколько способов, в которых это может произойти. Подтопии, которые следуют описанию некоторых основных ошибок, которые разработчик должен избежать.

Условия гонки в методе Dispose

Если метод Dispose класса (дополнительные сведения см. в разделе "Сборка мусора") не синхронизирован, возможно, что код очистки внутри Dispose может выполняться несколько раз, как показано в следующем примере.

void Dispose()
{  
    if (myObj != null)
    {  
        Cleanup(myObj);  
        myObj = null;  
    }  
}  

Так как эта реализация Dispose не синхронизирована, можно Cleanup вызывать сначала одним потоком, а затем вторым потоком, прежде чем _myObj задать значение NULL. Зависит ли это от того, что происходит при выполнении Cleanup кода. Основная проблема с несинхронизированными реализациями Dispose включает использование дескрипторов ресурсов, таких как файлы. Неправильное удаление может привести к неправильному использованию дескриптора, что часто приводит к уязвимостям системы безопасности.

Условия гонки в конструкторах

В некоторых приложениях можно получить доступ к членам класса другим потокам до полного запуска конструкторов классов. При необходимости необходимо просмотреть все конструкторы классов, чтобы убедиться, что при этом не должно возникнуть никаких проблем безопасности или синхронизации потоков.

Условия гонки с кэшируемыми объектами

Код, который кэширует сведения о безопасности или использует операцию security Assert для доступа к коду, также может быть уязвим для условий расы, если другие части класса не синхронизированы соответствующим образом, как показано в следующем примере.

void SomeSecureFunction()
{  
    if (SomeDemandPasses())
    {  
        fCallersOk = true;  
        DoOtherWork();  
        fCallersOk = false;  
    }  
}  
void DoOtherWork()
{  
    if (fCallersOK)
    {  
        DoSomethingTrusted();  
    }  
    else
    {  
        DemandSomething();  
        DoSomethingTrusted();  
    }  
}  

Если есть другие пути к DoOtherWork вызову из другого потока с тем же объектом, ненадежный вызывающий объект может проскользнуть мимо запроса.

Если код кэширует сведения о безопасности, убедитесь, что вы просматриваете ее для этой уязвимости.

Условия гонки в методах завершения

Условия гонки также могут возникать в объекте, который ссылается на статический или неуправляемый ресурс, который затем освобождается в его методе завершения. Если несколько объектов совместно используют ресурс, управляемый в методе завершения класса, объекты должны синхронизировать весь доступ к такому ресурсу.

См. также