- PVSM.RU - https://www.pvsm.ru -

Уязвимости, которые устранила команда PVS-Studio на этой неделе: выпуск N1

Уязвимости, которые устранила команда PVS-Studio на этой неделе: выпуск N1 - 1

Мы решили в меру своих сил регулярно искать и устранять уязвимости и баги в различных проектах. Можно назвать это помощью open-source проектам. Можно — разновидностью рекламы или тестированием анализатора. Еще вариант — очередной способ привлечения внимания к вопросам качества и надёжности кода. На самом деле, не важно название, просто нам нравится это делать. Назовём это необычным хобби. Давайте посмотрим, что интересного было обнаружено в коде различных проектов на этой неделе. Мы нашли время сделать исправления и предлагаем вам ознакомиться с ними.

Для тех, кто ещё не знаком с инструментом PVS-Studio

PVS-Studio [1] — это инструмент, который выявляет в коде многие разновидности ошибок и уязвимостей. PVS-Studio выполняет статический анализ кода и рекомендует программисту обратить внимание на участки программы, в которых с большой вероятностью содержатся ошибки. Наилучший эффект достигается тогда, когда статический анализ выполняется регулярно. Идеологически предупреждения анализатора подобны предупреждениям компилятора. Но в отличии от компиляторов, PVS-Studio выполняет более глубокий и разносторонний анализ кода. Это позволяет ему находить ошибки в том числе и в компиляторах: GCC [2]; LLVM 1 [3], 2 [4], 3 [5]; Roslyn [6].

Поддерживается анализ кода на языках C, C++ и C#. Анализатор работает под управлением Windows и Linux. В Windows анализатор может интегрироваться как плагин в Visual Studio.

Для дальнейшего знакомства с анализатором, предлагаем изучить следующие материалы:

  • Подробная презентация [7] на сайте SlideShare. В формате видео [8] она доступна на YouTube (47 минут).
  • Статьи [9] о проверенных открытых проектах.

Уязвимости

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

1. CoreFX. CWE-476 (NULL Pointer Dereference)

V3080 [10] Possible null dereference. Consider inspecting '_swtFirst'. MemberLookup.cs 109

if (_swtFirst == null)
{
  _swtFirst.Set(sym, type); // <= 
  ....
}

Pull Request [11]

2. CoreFX. CWE-476 (NULL Pointer Dereference)

V3080 [10] Possible null dereference. Consider inspecting 'tabClasses'. PropertyTabAttribute.cs 225

if (tabClasses != null)                        // <=
{
  if (tabScopes != null && tabClasses.Length != tabScopes.Length)
  {
    ....
  }
  _tabClasses = (Type[])tabClasses.Clone();
}
else if (tabClassNames != null)
{
  if (tabScopes != null &&
      tabClasses.Length != tabScopes.Length)    // <=
  {
    ....
  }
  _tabClassNames = (string[])tabClassNames.Clone();
  _tabClasses = null;
}

Pull Request [11]

3. CoreFX. CWE-476 (NULL Pointer Dereference)

V3080 [10] Possible null dereference. Consider inspecting 'BaseSimpleType'. SimpleType.cs 368

if ((BaseSimpleType == null && otherSimpleType.BaseSimpleType != null)
    &&
    (BaseSimpleType.HasConflictingDefinition(...)).Length != 0) // <=
    return ("BaseSimpleType");

Pull Request [11]

4. CoreFX. CWE-476 (NULL Pointer Dereference)

V3019 [12] Possibly an incorrect variable is compared to null after type conversion using 'as' keyword. Check variables 'o', 'other'. CompilerInfo.cs 106

CompilerInfo other = o as CompilerInfo;
if (o == null)
{
    return false;
}
return CodeDomProviderType == other.CodeDomProviderType && ... // <=

Pull Request [11]

5. CoreFX. CWE-476 (NULL Pointer Dereference)

V3019 [12] Possibly an incorrect variable is compared to null after type conversion using 'as' keyword. Check variables 'myObject', 'myString'. CaseInsensitiveAscii.cs 46

string myString = myObject as string;
if (myObject == null)
{
    return 0;
}
int myHashCode = myString.Length;      // <=

PVS-Studio: fixed vulnerability CWE-476 (NULL Pointer Dereference)

Pull Request [11]

6. CoreFX. CWE-476 (NULL Pointer Dereference)

V3019 [12] Possibly an incorrect variable is compared to null after type conversion using 'as' keyword. Check variables 'a', 'nodeA'. AttributeSortOrder.cs 22

V3019 [12] Possibly an incorrect variable is compared to null after type conversion using 'as' keyword. Check variables 'b', 'nodeB'. AttributeSortOrder.cs 22

XmlNode nodeA = a as XmlNode;
XmlNode nodeB = b as XmlNode;
if ((a == null) || (b == null))
    throw new ArgumentException();
int namespaceCompare =
  string.CompareOrdinal(nodeA.NamespaceURI, nodeB.NamespaceURI); // <=

Pull Request [11]

7. CoreFX. CWE-476 (NULL Pointer Dereference)

V3019 [12] Possibly an incorrect variable is compared to null after type conversion using 'as' keyword. Check variables 'a', 'nodeA'. NamespaceSortOrder.cs 21

V3019 [12] Possibly an incorrect variable is compared to null after type conversion using 'as' keyword. Check variables 'b', 'nodeB'. NamespaceSortOrder.cs 21

XmlNode nodeA = a as XmlNode;
XmlNode nodeB = b as XmlNode;
if ((a == null) || (b == null))
    throw new ArgumentException();
bool nodeAdefault = Utils.IsDefaultNamespaceNode(nodeA); 
bool nodeBdefault = Utils.IsDefaultNamespaceNode(nodeB); 

Pull Request [11]

8. MSBuild. CWE-476 (NULL Pointer Dereference)

V3095 [13] The 'name' object was used before it was verified against null. Check lines: 229, 235. Microsoft.Build.Tasks GenerateBindingRedirects.cs 229

V3095 [13] The 'publicKeyToken' object was used before it was verified against null. Check lines: 231, 235. Microsoft.Build.Tasks GenerateBindingRedirects.cs 231

private void UpdateExistingBindingRedirects(....)
{
  ....
  var name = assemblyIdentity.Attribute("name");
  var nameValue = name.Value;  // <=
  var publicKeyToken = assemblyIdentity.
                       Attribute("publicKeyToken");
  var publicKeyTokenValue = publicKeyToken.Value;  // <=
  var culture = assemblyIdentity.Attribute("culture");
  var cultureValue = culture == null ? 
                     String.Empty : culture.Value;
  
  if (name == null || publicKeyToken == null)
  {
      continue;
  }  
  ....
}

Pull Request [14]

Прочие ошибки

1. MSBuild

V3041 [15] The expression was implicitly cast from 'long' type to 'float' type. Consider utilizing an explicit type cast to avoid the loss of a fractional part. An example: double A = (double)(X) / Y;. Microsoft.Build CommunicationsUtilities.cs 615

private static long s_lastLoggedTicks = DateTime.UtcNow.Ticks;
internal static void Trace(....)
{
  ....
  long now = DateTime.UtcNow.Ticks;
  float millisecondsSinceLastLog = 
    (float)((now - s_lastLoggedTicks) / 10000L);
  ....
}

Pull Request [14]

2. MSBuild

V3118 [16] Milliseconds component of TimeSpan is used, which does not represent full time interval. Possibly 'TotalMilliseconds' value was intended instead. MSBuild XMake.cs 629

public static ExitType Execute(string commandLine)
{
  ....
  if (!String.IsNullOrEmpty(timerOutputFilename))
  {
      AppendOutputFile(timerOutputFilename, 
                        elapsedTime.Milliseconds);
  }
  ....
}

Pull Request [14]

Заключение

Предлагаем скачать анализатор PVS-Studio и попробовать проверить ваш проект:

Для снятия ограничения [19] демонстрационной версии, вы можете написать [20] нам, и мы отправим вам временный ключ.

Для быстрого знакомства с анализатором, вы можете воспользоваться утилитами, отслеживающими запуски компилятора и собирающие для проверки всю необходимую информацию. См. описание утилиты CLMonitoring [21] и pvs-studio-analyzer [22]. Если вы работаете с классическим типом проекта в Visual Studio, то всё ещё проще: достаточно выбрать в меню PVS-Studio команду «Check Solution».

Автор: PVS-Studio

Источник [23]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/c-2/248812

Ссылки в тексте:

[1] PVS-Studio: https://www.viva64.com/ru/pvs-studio/

[2] GCC: https://www.viva64.com/ru/b/0425/

[3] 1: https://www.viva64.com/ru/b/0108/

[4] 2: https://www.viva64.com/ru/b/0155/

[5] 3: https://www.viva64.com/ru/b/0446/

[6] Roslyn: https://www.viva64.com/ru/b/0363/

[7] презентация: https://www.slideshare.net/Andrey_Karpov/pvsstudio-static-code-analyzer-windowslinux-ccc-2017

[8] видео: https://www.youtube.com/watch?v=kmqF130pQW8&amp;feature=youtu.be

[9] Статьи: https://www.viva64.com/ru/inspections/

[10] V3080: http://www.viva64.com/ru/w/V3080/

[11] Pull Request: https://github.com/dotnet/corefx/pull/16807

[12] V3019: http://www.viva64.com/ru/w/V3019/

[13] V3095: http://www.viva64.com/ru/w/V3095/

[14] Pull Request: https://github.com/Microsoft/msbuild/pull/1829

[15] V3041: http://www.viva64.com/ru/w/V3041/

[16] V3118: http://www.viva64.com/ru/w/V3118/

[17] PVS-Studio для Windows: https://www.viva64.com/ru/pvs-studio-download/

[18] PVS-Studio для Linux: https://www.viva64.com/ru/pvs-studio-download-linux/

[19] ограничения: https://www.viva64.com/ru/m/0009/

[20] написать: https://www.viva64.com/ru/about-feedback/

[21] CLMonitoring: https://www.viva64.com/ru/m/0031/

[22] pvs-studio-analyzer: https://www.viva64.com/ru/m/0036/

[23] Источник: https://habrahabr.ru/post/323646/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best