2017-01-26 13 views
3

RELEASEモードで構築されているにもかかわらず、以下の展開されたコードの下に到達するか、「持ち上げる」ことができるかどうかに関して、セキュリティ上の議論が進行中です。Releaseでビルドした後にDEBUGを実行できますか?

思考?

EDIT:
私はDotPeekでそれを "見る" ん - でもリリースで構築した後。

  • ただし、ファイルは「グレー表示」である

  • それはそれは実行されませんを意味していますか?

  • DotPeekは単にコードを "デコンパイル"します...内蔵されているモードにどのようなコードが存在するのかはわかりません。

CODEは、次のようになります。

using System; 
    using System.ServiceProcess; 

    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     static void Main() 
     { 
#if DEBUG 
      var myservice = new StpListener(); 
      myservice.OnDebug(); 

      //KEEP the service alive 
      System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite); 
#else 
      ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
      { 
       new StpListener() 
      }; 
      ServiceBase.Run(ServicesToRun); 
#endif 
     } 
    } 
+0

dotPeekで両方を作成して見てみませんか? –

+0

dotPeekについてあまりよく知られていません - PDBにアクセスして実際のソースファイルを取得する機能はありますか?もしそうなら、あなたの 'exe'だけを別のディレクトリにコピーしてから、exeをチェックしてください。 –

+0

(または、dotPeekのドキュメントを見るだけで、ソースファイルを取得できるときでもデコンパイルするオプションがあります - それを使って結論を出す前にそのオプションを使用していることを確認してください) –

答えて

5

デバッグ/リリース構成と条件付きコードを混同しないでください。リリースモードの設定には、DEBUGの条件付き属性を適用することは完全に可能です。

見て、私は悪です!

enter image description here

参照:When #if DEBUG runs

2

(すべての可能性で、これはすべてC#対応のコンパイラについても同様ですが)あなたがRoslynコンパイラを使用していると仮定すると、#if DEBUGコードもされませんILにコンパイルされているので、絶対にアクセスできません。

しかし、Conditional("DEBUG")を使用すると、コードがILに変換され、その呼び出しが削除されるため、おそらくこれがセキュリティ上の欠陥になる可能性があります。

5

それはコンパイル時機能です。コンパイラの仕事が終了したらのコードが#if#elseまたはのコードを#else#endifの間に指定します。

両方のコードセットを含むバイナリを生成することは決してありません。

+2

また、DEBUGはプロジェクト設定でReleaseの下にまだ定義されている可能性があるので、実際には可能です。 –

+0

@CamiloTerevinto - 私は、「実行時に悪意を持って間違ったコードを実行させることができますか?」という質問を受けました。正しいコード(非デバッグコード)を含むデプロイメントをビルドした場合、そのビルド中に暗黙的に 'DEBUG'が定義されていません。 –

+0

チームの悪意のある開発者がDEBUGを#defineしたとしたら? –

1

This Resourceはさらに説明するが、プリプロセッサコマンドはコンパイル時に評価される。それらを単独で使用しても、セキュリティ上の弱点はありませんが、評価する条件が問題になることはありません。 #If DEBUGは、たとえばif(Debugger.IsAttached)よりも安全です。実行時の状態に応じて、#Ifを応答させたくないだけです(とにかくやり遂げることになります)。

関連する問題