2017-05-10 10 views
1

私はXMLを使用して第三者Webサービスと通信しています。私たちのセキュリティスキャナがいくつかの脆弱性を報告している点を除いて、すべてうまくいっています。CWE-216XMLSerializationを使用したクリアテキストパスワード

パスワードが実際にサードパーティがクリアテキストで送信されるパスワードを必要とする(例のために簡素化された)以下に類似LoginDetailsクラス

[Serializable()] 
public class LoginDetails 
{ 
    public string Login { get; set; } 
    public string Password { get; set; } 
} 

内のメモリに格納されます。だから残念ながら私はここでは選択肢がありません。私がしたいのは、フィールドが安全に保管され、かつ/または使用されたときにできるだけ早くメモリから取り除かれることです。

修復に関して、私はSecureStringの両方を明示的に使用しようとしましたが、StringBuilderを使用すると、これは不変性を否定します。私もLoginDetailsクラスにIDisposableを実装しようとしました。これは、2つのプロパティをnullに設定することで構成されていました。私は様々な議論につながりました(particularly this one)、それは実際にはあまり効果がないと述べています。

フィールドタイプをSecureStringまたはStringBuilderに変更すると問題が発生します。これらは正しくシリアル化されないため、サードパーティでリクエストが失敗します。 XMLSerializerをオーバーライドして、これらのタイプを異なる方法で処理する方法はありますか?つまり、私たちの側ではメモリにいくらか安全に保存されますが、クリアテキストで第三者に送信されます。これらのセキュリティの試みは両側では実施されないでしょうか?

また、私が完全に見落としたことはありますか?

多くのおかげ

+0

ようfinallyブロック内に配置することができ、あなたは彼らが正しくシリアライズされていないとはどういう意味ですか? – NMGod

+0

私はそのビットを言い直しましょう。私は彼らが彼らのタイプに応じて "正しく"シリアライズされていると仮定しています。 SecureStringは直列化可能(わかりやすい)ではありませんが、StringBuilderはとして xx xxとしてシリアル化されます。私が必要とするのは、私がXMLSerializerを使用するまで安全である(または私が現在持っているものよりも安全な)ものです。その時点で、Passwordプロパティのクリアテキスト値が第三者に送信されます。 –

+0

StringBuilderをRemmeberするだけでは非継承です。 – NMGod

答えて

0

は、この問題を回避するために、私はIXmlSerializableIDisposableの両方を実装SerializableSecureStringという名前のカスタムタイプを作成しました。

今後のお手伝いを希望します。

実装

タイプは、直列化のために使用されているプラ​​イベートSecureStringメンバ変数、およびプライベートstringプロパティが含まれています。次のように民間の文字列プロパティのgetは、プライベートメンバ変数をアンラップ

private readonly SecureString Content = new SecureString(); 
private string Value { } 

...

get 
{ 
    IntPtr bstr = Marshal.SecureStringToBSTR(Content); 
    string copiedText = Marshal.PtrToStringAuto(bstr); 
    Marshal.ZeroFreeBSTR(bstr); 

    return copiedText; 
} 

2つのコンストラクタがあります。シリアライズのために.Netだけで使用される空のコンストラクタ。

public SerializableSecureString() 
{ 
} 

...そして実際のタイプの構築のために。それは

public SerializableSecureString(string clearText) 
{ 
    if (clearText != null) 
    { 
     foreach (char t in clearText) 
      Content.AppendChar(t); 
    } 
} 

シリアライズがWriteXml機能でIXmlSerializableの実装で起こる...平文の文字列を受け取り、そのようなSecureString変数にそれをパッケージ化します。 WriteStringを使用してプライベート文字列プロパティ(値)の値を書き出します...

public void WriteXml(XmlWriter writer) 
{ 
    writer.WriteString(Value); 
} 

SecureString値を配置するために、私はIDisposableパターン内Dispose方法を実装し、呼び出さContent.Dispose()

に引用として私は(LoginDetailsクラスのインスタンスを作成することができ

使用次のように...

LoginDetails loginDetails = new LoginDetails 
{ 
    Login = "MyUsername", 
    Password = new SerializableSecureString(WebConfigurationManager.AppSettings["MyPassword"]) 
}; 

パスワードはweb.configファイルの暗号化されたセクションに格納されます。したがって、WebConfigurationManagerを使用します。

を使用した後、データは以下の

finally 
{ 
    LoginDetails.Password.Dispose(); 
} 
関連する問題