今週PVS-Studioチームによって修正される潜在的な脆弱性:N1リリース



さまざまなプロジェクトの脆弱性とバグを定期的に検索して修正する能力を最大限に活用することにしました。 オープンソースプロジェクトを使用して呼び出すことができます。 できること-一種の広告またはアナライザーのテスト。 別のオプションは、コードの品質と信頼性の問題に注意を引く別の方法です。 実際、名前は重要ではありません、私たちはそれをやりたいだけです。 それを珍しい趣味と呼んでください。 今週、さまざまなプロジェクトのコードで何が興味深いかを見てみましょう。 時間をかけて修正を行い、修正に慣れることをお勧めします。

まだPVS-Studioツールに慣れていない人向け


PVS-Studioは、コード内の多くのタイプのエラーと脆弱性を検出するツールです。 PVS-Studioは静的コード分析を実行し、エラーを含む可能性のあるプログラムのセクションにプログラマーが注意を払うことを推奨します。 静的解析を定期的に実行すると、最高の効果が得られます。 イデオロギー的に、アナライザーの警告はコンパイラーの警告に似ています。 ただし、コンパイラとは異なり、PVS-Studioはコードのより詳細で包括的な分析を実行します。 これにより、コンパイラーなどでエラーを見つけることができます: GCC ; LLVM 1、2、3 ; ロズリン

C、C ++、およびC#でサポートされているコード分析。 アナライザーは、WindowsおよびLinuxで実行されます。 Windowsでは、アナライザーはVisual Studioのプラグインとして統合できます。

アナライザーの詳細については、次の資料を検討することをお勧めします。


潜在的な弱点


このセクションでは、CWE分類に該当し、本質的に脆弱性である欠陥を特定します。 もちろん、すべてのプロジェクトで脆弱性が何らかの実用的な脅威をもたらすわけではありませんが、そのような状況を見つけることができることを示したいと思います。

1. CoreFX。 CWE-476(NULLポインター逆参照)

V3080 nullの逆参照の可能性。 「_swtFirst」の検査を検討してください。 MemberLookup.cs 109

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

プルリクエスト

2. CoreFX。 CWE-476(NULLポインター逆参照)

V3080 nullの逆参照の可能性。 「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; } 

プルリクエスト

3. CoreFX。 CWE-476(NULLポインター逆参照)

V3080 nullの逆参照の可能性。 「BaseSimpleType」の検査を検討してください。 SimpleType.cs 368

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

プルリクエスト

4. CoreFX。 CWE-476(NULLポインター逆参照)

V3019 「as」キーワードを使用した型変換後に、誤った変数がnullと比較される可能性があります。 変数「o」、「other」を確認してください。 CompilerInfo.cs 106

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

プルリクエスト

5. CoreFX。 CWE-476(NULLポインター逆参照)

V3019 「as」キーワードを使用した型変換後に、誤った変数がnullと比較される可能性があります。 変数「myObject」、「myString」を確認してください。 CaseInsensitiveAscii.cs 46

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

PVS-Studio:脆弱性CWE-476(NULLポインターの逆参照)を修正

プルリクエスト

6. CoreFX。 CWE-476(NULLポインター逆参照)

V3019 「as」キーワードを使用した型変換後に、誤った変数がnullと比較される可能性があります。 変数「a」、「nodeA」を確認してください。 AttributeSortOrder.cs 22

V3019 「as」キーワードを使用した型変換後に、誤った変数がnullと比較される可能性があります。 変数「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); // <= 

プルリクエスト

7. CoreFX。 CWE-476(NULLポインター逆参照)

V3019 「as」キーワードを使用した型変換後に、誤った変数がnullと比較される可能性があります。 変数「a」、「nodeA」を確認してください。 NamespaceSortOrder.cs 21

V3019 「as」キーワードを使用した型変換後に、誤った変数がnullと比較される可能性があります。 変数「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); 

プルリクエスト

8. MSBuild。 CWE-476(NULLポインター逆参照)

V3095 「name」オブジェクトは、nullに対して検証される前に使用されました。 行を確認:229、235。Microsoft.Build.Tasks GenerateBindingRedirects.cs 229

V3095 「publicKeyToken」オブジェクトは、nullと照合される前に使用されました。 行を確認: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; } .... } 

プルリクエスト

その他のエラー


1. MSBuild

V3041式は暗黙的に「long」型から「float」型にキャストされました。 分数部分の損失を避けるために、明示的な型キャストの使用を検討してください。 例: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); .... } 

プルリクエスト

2. MSBuild

V3118 TimeSpanのミリ秒コンポーネントが使用されますが、これは完全な時間間隔を表すものではありません。 代わりに、おそらく「TotalMilliseconds」値が意図されていました。 MSBuild XMake.cs 629

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

プルリクエスト

おわりに


PVS-Studioアナライザーをダウンロードして、プロジェクトを確認することをお勧めします。
デモ版の制限を取り除くために、あなたは私たちに書くことができます、そして、我々はあなたに一時的なキーを送ります。

アナライザーをすばやく知るには、コンパイラーの起動を追跡し、検証に必要なすべての情報を収集するユーティリティーを使用できます。 CLMonitoringおよびpvs-studio-analyzerユーティリティの説明を参照してください。 Visual Studioで従来のタイプのプロジェクトを使用している場合は、PVS-Studioメニューから[ソリューションの確認]コマンドを選択するだけで簡単です。



この記事を英語圏の聴衆と共有したい場合は、翻訳へのリンクを使用してください:Andrey Karpov。 今週PVS-Studioによって検出された脆弱性:エピソードN1

記事を読んで質問がありますか?
多くの場合、記事には同じ質問が寄せられます。 ここで回答を収集しました: PVS-Studioバージョン2015に関する記事の読者からの質問への回答 。 リストをご覧ください。

Source: https://habr.com/ru/post/J323646/


All Articles