確保メモリアロケータで、C++
-
08-06-2019 - |
質問
を実現したいアロケータを提供するメモリは以下の属性
- できないページごとに区切るディスク。
- は非常に難しいアクセスを通じて、付属のデバッガ
ここに感情のようなライセンス情報をアクセスできなくなるのユーザーです。そして、通常のオンラインから人気の少ない、見つからない良い場所で開始します。
更新
ジ 記載の使用 VirtualAlloc
設定の保護をメモリ空間です。を制作しましたカスタムアロケータ(以下に示していたのに VirtualLock
機能が制限されていメモリの量で割り当てといっていいのかもしれない設計によるものです。以降のまま使用した小さなことは問題なく対応します。
//
template<class _Ty>
class LockedVirtualMemAllocator : public std::allocator<_Ty>
{
public:
template<class _Other>
LockedVirtualMemAllocator<_Ty>& operator=(const LockedVirtualMemAllocator<_Other>&)
{ // assign from a related LockedVirtualMemAllocator (do nothing)
return (*this);
}
template<class Other>
struct rebind {
typedef LockedVirtualMemAllocator<Other> other;
};
pointer allocate( size_type _n )
{
SIZE_T allocLen = (_n * sizeof(_Ty));
DWORD allocType = MEM_COMMIT;
DWORD allocProtect = PAGE_READWRITE;
LPVOID pMem = ::VirtualAlloc( NULL, allocLen, allocType, allocProtect );
if ( pMem != NULL ) {
::VirtualLock( pMem, allocLen );
}
return reinterpret_cast<pointer>( pMem );
}
pointer allocate( size_type _n, const void* )
{
return allocate( _n );
}
void deallocate(void* _pPtr, size_type _n )
{
if ( _pPtr != NULL ) {
SIZE_T allocLen = (_n * sizeof(_Ty));
::SecureZeroMemory( _pPtr, allocLen );
::VirtualUnlock( _pPtr, allocLen );
::VirtualFree( _pPtr, 0, MEM_RELEASE );
}
}
};
に用いられ
//a memory safe std::string
typedef std::basic_string<char, std::char_traits<char>,
LockedVirtualMemAllocato<char> > modulestring_t;
Ted Percival つmlockがって実施する。
見 実践的な暗号化によるコFurguson、Bruce Schneier 非常に有用です。
解決
したりすることはできませんの保護のたメモリアクセス。できるのではないでしょうかを防止ページングの場合は走行としてのadmin(管理者としてのシステムとはできません防止のための管理システムから読みです。だがなんとか完全にブロックのその他のプロセスからの読みの記憶きない)、別の工程でまだまだ十分とはいえませんが実際に入また新しいスレッドのおだわり抜いた日本発のアプリをメモリすることができてうれしいです。
だがなんとか完全にロックの下でプロセスを保証するよう、OSのよう ない を誰もがアクセスの過程で、だいて保護します。全体OSが稼動中の仮想マシンが一時停止および検査します。
す できない 保護メモリの内容からのオーナーシステム。ハリウッドの音楽業界にて痛むこと。が可能となっているようです。
他のヒント
Unixシステムでは利用できる mlock(2) ロックメモリページへのRAMを防止しているページごとに区切.
mlock()およびmlockall()はそれぞれのロックの全部または一部を呼び出し プロセスの仮想アドレス空間へのRAMとなるのを予防するメモリから ているページごとに区切るスワップです。
がどのくらいメモリの各プロセスできるロックでできます。 ulimit -l
やは測定数です。自分のシステムのデフォルト値が32kiBります。
だ開発のための窓ができる方法を制限するとメモリへのアクセスがブロック絶対に行なってい可.ればいいの秘密秘密は読み 文書認証コード る問題に一部の長さでも注意しますを知る術を持っていませんがコードしないようにするには、実機または仮想マシン。あっWin32API渉cryptoを取り扱うこのようなことを含む、安全な保管の秘密-本件についての質問です。お見ることができるオンライン Microsoft CyproAPI 詳細についてはOSのデザイナーのみこの問題に保つ必要があるのcleartext個人情報を保護し、再度読み 文書認証コード).
のWin32API機能 VirtualAlloc
のOSレベルのメモリアロケータ.できるセットアクセスを保護なにができるのかを設定へのアクセス PAGE_GUARD
または PAGE_NOACCESS
, は、フリップへのアクセスも好なプログラムを読み込み、リセットしますその後、それは単なる速ぶだれようと本当に難しいんぞです。
この暗号化Apiをお使いのプラットフォームはその問題のようhack上げます。
きっかけに少しでも時間:
を実現したいアロケータを によるメモリの 属性:
このフェアです。
* cannot be paged to disk.
ることとする。と認識していません無効に仮想ページングとして扱いますと重点が移りつつある。がある場合は、ご連絡させていただきます。spelunkingの腸の重点が移りつつある。
* is incredibly hard to access through an attached debugger
き実行でPGPダウンロードしましょう暗号化されたメモリやunencryptです。膨大な性能。
ここに 機密情報(のようなライセンス 情報が必要 利用できな力を示すことができた。を行っています 通常のオンラインをつくるために 複数の人のこん なのに良い場所で起こ 問題です。
すべての機密情報をoffにする。けます。保管しないでくださいの機密情報を記憶です。書カスタム削除-ルーチンが自動的に削除すべてのデータから割当てます。によって、一般のアクセスへの機敏感な材料です。を実行した場合dbアクセスだけでなく、アクセスが殺菌前に焼く方法。サミットに向けて特定のログインも可能です。くいくために欠かせないグループです。
なお、どのような資料がどのような方法 あのアクセスメモリの 工程以外の取り付け デバッガ?
をダンプします。
イLibsodium、配分機構#含む <sodium.h>
ガーヒープの割当て
以下のmalloc()やご友人な3または4追加ページの仮想メモリ。
void *sodium_malloc(size_t size);
メモリを割り当てる店舗の機密データを用い sodium_malloc()
や sodium_allocarray()
.る必要がありますの最初の呼び出し sodium_init()
を使用する前にこれらのヒープガードです。
void *sodium_allocarray(size_t count, size_t size);
の sodium_allocarray()
関数ポインタを返しまからカウントオブジェクトサイズをバイトのメモリでご利用いただけます。でと同様の保証として sodium_malloc()
も保護があふれる演算の場合 count * size
を超える SIZE_MAX
.
これらの機能の追加ガードページに保護されたデータをできるアクセス可能でheartbleedようなシナリオ。
また、保護のためのメモリ領域割り当てる方法で変更が可能で、固定メモリ操作 sodium_mprotect_noaccess()
, sodium_mprotect_readonly()
や sodium_mprotect_readwrite()
.
後 sodium_malloc
利用できる sodium_free()
ロックを解除し、を修復させようとするとエラーが記憶です。この点を実装を考えてゼロ設定を記憶する。
ゼロのメモリ使用後
void sodium_memzero(void * const pnt, const size_t len);
使用後に敏感なデータが上書きされ、memset()や手書きすることが可能で黙々と剥離による最適化コンパイラやリンカー.
のsodium_memzero()関数を実質的にゼロlenバイトからの活用の場合でも、最適化の適用についてのコードです。
ロックメモリの割り当て
int sodium_mlock(void * const addr, const size_t len);
の sodium_mlock()
機能ロックを少なくともlenバイトのメモリーから説明します。このよ交換機密データをディスク。
int sodium_mprotect_noaccess(void *ptr);
のsodium_mprotect_noaccess()機能で地域を割り当てを使用sodium_malloc()またはsodium_allocarray()利用できません。できな読み取り/書き込みをするのですが、データが保存されます。この機能が使用できる機密データを利用できな場合を除き実際に必要な特定の動作します。
int sodium_mprotect_readonly(void *ptr);
のsodium_mprotect_readonly()関数の地域割り当てを使用sodium_malloc()またはsodium_allocarray()として読み取り専用になります。ようにデータを作成すると、プロセスを終了させます。
int sodium_mprotect_readwrite(void *ptr);
の sodium_mprotect_readwrite()
機能マーク地域を割り当ての使用 sodium_malloc()
または sodium_allocarray()
として読み書き可能なされている保護用 sodium_mprotect_readonly()
または sodium_mprotect_noaccess()
.
ううえでの取り扱いのOSです。このデータはプログラムでは責任を負いるページごとに区切る。
アクセスするための記憶、意欲ある人を付けることができるハードウェアアンインストールします。
@graham
き実行でPGPダウンロードしましょう暗号化されたメモリやunencryptです。膨大な性能。
しい鍵となる。るということなのでしょうが、絶対に不可能ではない。誰にも気が管理するデータを取得しました。
最良のベットを導入することによって、現在のようなものです。ネSecureStringクラス、うよう十分注意してくださいゼロは平文書データとすぐにはそれぞれについて、"これまでも忘れずに清掃時には例外がスローされ).良いことがあり、std::stringなどを使用 カスタムアロケータ.
Windowsをご利用の場合CryptProtectMemory(RtlEncryptMemoryのために古いシステム、暗号化パスワードが格納され非pageable(kernel?) ます。私の試験は、これらの機能もあぁ、あります。を考慮し、保護いえます。
その他のシステム、利用ふぐらいミックスの間の速度と強みです。後者の場合、またランダムに生成パスワード(16+バイトのエントロピーのためのふぐ)のプログラムで起動します。残念なことがないかを試してみましょう。を保護するパスワードなOSサポートが利用する場合もあるでしょう総難読化手法を組み込むにはハードコードされた塩値入実行可能とを組み合わせることができ、パスワード(ち).
全体的に、この戦略の一部は、広範な防衛-深ます。また簡単なバグなどのバッファオーバーフローな殺菌プログラムの入力依然として最も一般的な攻撃ベクトル.
はできませんの保護のたメモリの内容からのオーナーシステム。ハリウッドの音楽業界にて痛むこと。が可能となっているようです。
あなたは見Vista(以上) 保護プロセス (直接 .docダウンロード).この営業システム-施行され保護を提供エンタテインメント業界におけ
@Derek:Ohが信頼できる計算を使用でき メモリcurtaining!:-P</devils-advocate>
@素を加えリゾット
私たとき、気がついていないだけというかします。おばけっこううってついにのみ可能ファイルにアクセスの文脈において、プログラムを保持するのにまで高められる予定である。
思いを受け入れることはありませんが真に安全かつ店誰かのファイルを他のコンピュータまでのアクセスが許可されるファイルの場所にあります。
この問題です。ときもする安全にできな助成金のアクセス、そのままアクセスを許可、制御になっていることがある。いなかったということではないかと少し難しくなることはありません。
@クリス
Ohが信頼できる計算を使用メモリcurtaining!:-P
そして実際に支払うコンピュータ誰かの場所です。p
@デリックパーク
たとが不可能ではない。PGPということなので硬く不可能ではない。