見出し画像

🎶Singletonパターンはデッドロックを起こす危険性あり CWEしらべ

Singletonクラスが一度だけインスタンス化されることを保証するために、適切なロックまたは他の同期メカニズムを使用していない。

インスタンス生成処理をスレッドセーフにせず、デッドロック (CWE-833) やライブロック状態を引き起こすことで、ソフトウェアの信頼性の高い実行を妨げる可能性があります。この信頼性の問題は、攻撃者が関連するコードに到達可能な場合、脆弱性を引き起こす可能性があります。

Singletonパターンは、特定のクラスのインスタンスをプログラム全体で1つだけ持つことを保証するデザインパターンです。しかし、Singletonパターンはいくつかの問題点や脆弱性を持っています。

  1. グローバルステート: Singletonは、その性質上、グローバルな状態を持っています。これはテストの障害となる可能性があります。テストの際には独立した状態を持つインスタンスを生成し、それを隔離してテストしたいところですが、Singletonの場合、一度インスタンスが生成されると、プログラム全体でそのインスタンスが共有されるため、テストの際に状態をリセットすることが難しくなります。

  2. 拡張性の制限: Singletonクラスは、通常、そのインスタンスを取得するためのstaticメソッドを持っています。これは、そのクラスを継承して拡張することを困難にします。また、Singletonクラスのインスタンスはプログラム全体で1つしか生成されないため、必要に応じて異なる実装を利用することができなくなります。

  3. マルチスレッド環境: マルチスレッド環境では、Singletonのインスタンスが複数のスレッドから同時にアクセスされる可能性があります。これにより、インスタンスの状態が予期せず変更される可能性があります。インスタンスの生成時にも、複数のスレッドが同時にインスタンスを生成しようとすると、複数のインスタンスが生成されてしまう可能性があります。

  4. シリアライズの問題: Singletonインスタンスがシリアライズされ、その後デシリアライズされると、新しいインスタンスが生成される可能性があります。これはSingletonの目的に反するため、デシリアライズ時に特別な処理が必要になります。

  5. 依存性の隠蔽: Singletonパターンを使用すると、依存関係が隠蔽されるため、コードの理解が困難になります。


お願い致します