문제

만들려고 할당자를 제공하는 메모리로 다음과 같은 속성:

  • 할 수 없는 페이지를 디스크에 있습니다.
  • 은 믿을 수 없을만큼 열심히 접속을 통해 연결된 디버거

아이디어는 이 포함됩니다 민감한 정보(면허증 정보)해야 하는 사용자에 액세스 할 수 없게됩니다.나는 보통의 온라인으로 연구하고 물었다 몇 가지 다른 사람에 대해,그러나 나는 찾을 수 없습니다 좋은 장소에서 시작 이 문제를 해결합니다.

업데이트

Josh 언급하는 사용 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 퍼시벌 언급 mlock 지만,나의 구현하는 아직이다.

내가 발견 실용적인 암호화하여 닐 Furguson 및 브루스 슈나이어 매우 도움이 된다.

도움이 되었습니까?

해결책

할 수 없습니다 정말로 보호에 대하여 메모리 액세스입니다.할 수 있는 방 페이 실행하는 경우 관리자로 또는 시스템,하지만 당신을 막을 수 없 관리자나 시스템에서 읽기 당신의 기억.는 경우에도 어떻게 든 완전히 차단 다른 프로세스에서 읽기 당신의 기억(할 수 없는 경우),또 다른 프로세스할 수 있도 실제로 주입하는 새로운 스레드로 당신의 과정을 읽고 이 메모리는 방법입니다.

는 경우에도 어떻게든 수 있습이 완전히 잠그 프로세스 및 보장하는 것 OS 허용할 사람이 다른 사람에 액세스하는 프로세스에,당신은 여전히 있지 않는 완전한 보호.전체 OS 될 수 있는 가상 컴퓨터에서 실행 되는지 검사합니다.

당신 할 수 없 보호 메모리 내용물에서 소유자의 시스템입니다.할리우드와 음악 산업에 대한 갈망이다.가능하면,그들은 이미 그 일을하고 있습니다.

다른 팁

유닉스 시스템에서 사용할 수 있는 mlock(2) 해 잠금 메모리 페이지를 RAM,그들을 방지하는 페이징.

mlock()및 mlockall()각각 자물쇠의 일부 또는 전화 프로세스의 가상 주소 공간으로 RAM,을 방지하는 메모리에서 되는 페이징 스왑 영역입니다.

거기에 제한이 얼마나 많은 메모리를 각 과정할 수 있는 잠금할 수 있으로 표시 ulimit -l 은 측정 kb.시스템에 기본 제한 32kiB 별 과정이다.

을 개발하는 경우 윈도우,거기 있는 방법에 대한 액세스를 제한할 수 있습니다 메모리,하지만 절대적으로 차단 밖으로 다른 사람은 드리겠습니다.는 경우에 당신을 희망하고 비밀을 유지하는 비밀,읽 보안 코드 작성 -는 이 문제를 해결합니에서 몇 가지 길이 있지만 당신은 알 길이 없는 경우에는 코드는 실행하는 실제 기계 또는 가상 기계입니다.의 무리가있다 Win32API 물건을 다루는 암호화 이것을 처리하는 종류의 것을 포함하여 안전한 저장의 비밀-이 책에 대해 이야기다.당신이 볼 수 있습니다 온라인 Microsoft CyproAPI 자세한 내용;OS 을 인식한 디자이너 이 문제를 유지해야 할 필요성을 일반 텍스트 보안(다시 읽 보안 코드 작성).

Win32API 함수 VirtualAlloc 은 OS 수준의 메모리 할당자.그것을 설정할 수 있습 액세스 보호당신이 무엇을 할 수 있 는 설정에 액세스 PAGE_GUARDPAGE_NOACCESS, 와 액세스를 무언가를하는 동안 친근하는 프로그램를 읽고,그리고 그것을 다시 설정 이후에,하지만 단지속도 고비가려고 정말 열심히 자신의 비밀입니다.

요약에서 보면,암호화 Api 플랫폼에 그들은 문제를 해결보다 더 나은 당신이 뭔가 해킹을 수 있습니다.

이것은 비트 시간에:

만들려고 할당하는 제공하는 메모리로 다음 속성:

는 충분합니다.

* cannot be paged to disk.

그단하기 위하여 려고 하고 있다.마찬가지로 지금까지 내가 알고,당신은 사용하지 않도록 설정할 수 없는 가상는 페이징으로 그것에 의해 처리됩니다.이 있는 경우 방법이 다음을 수 있습니다 동굴에서의 창자 OS.

* is incredibly hard to access through an attached debugger

를 실행할 수 있습을 통해 그것 PGP 및 저장을 암호화에는 메모리 및 암호화하지 않음으로 필요합니다.대규모 성능했다.

아이디어는 이 포함됩니다 민감한 정보(면허 정보)야 사용자에 액세스 할 수 없게됩니다.나 일반적인 연구를 온라인과 요청 몇 가지 다른 사람에 대해,그러나 나 을 찾을 수 없는 좋은 장소에서 시작 이 문제입니다.

모든 민감한 정보의 기계입니다.심각합니다.중요한 정보를 저장하지 마십시오 메모리에 있습니다.쓰 사용자 지정 삭제 일상적인 것이 자동으로 제거하는 모든 데이터 어떤 할당을 수행할 수 있습니다.허용하지 않 일반적인 액세스를 가진 기계 민감한 물질에습니다.을 수행할 경우 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.

이러한 기능을 추가 가드 페이지를 주변에 보호된 데이터를 만들 가능성이 적은에 액세스할 수 있는 별과 같은 시나리오이다.

또한,보호를 위한 메모리 영역에 할당하는 방법을 사용하여 변경할 수 있습 잠금 메모리를 운영: 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()함수를 하려고 효과적으로 렌 바이트에서 시작 pnt 경우에도 최적화에 적용되는 코드입니다.

잠그는 메모리 할당

int sodium_mlock(void * const addr, const size_t len);

sodium_mlock() 기능 잠금 장치에 적어도 렌 바이트로의 기억에서 시작 addr.이 방지할 수 있습 교환 중요한 데이터를 디스크에 있습니다.

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().

당신이 무엇을 요구에 대한 처리되었습니다.일단 데이터가 프로그램에서,그것은 책임을 호출됩니다.

에 대한 액세스하는 메모리기의 개별할 수 있는 첨부 하드웨어 디버거.

@그레이엄

를 실행할 수 있습을 통해 그것 PGP 및 저장을 암호화에는 메모리 및 암호화하지 않음으로 필요합니다.대규모 성능했다.

고 있 키를 보유하는 메모리에 있습니다.는 그것을 좀 더 열심히,그러나 확실히 불가능하지 않습니다.누구나 동기전 관리 데이터를 얻을 메모리에서.

당신의 최선의 방법은 뭔가를 구현하는 유사한다.NET 의 SecureString 클래스고,매우 조심해야로 어떤 일반 텍스트 데이터의 복사본은 빨리 당신은행(는 것을 잊지 않을 정리할 때에도 예외가 발생).를 할 수 있는 좋은 방법이 std::string 등을 사용하는 것입 사용자 정의 할당.

윈도우에서 사용하는 경우,CryptProtectMemory(또는 RtlEncryptMemory 전 시스템),암호화된 암호가 저장된 비 페이징할 수 있(kernel?) 메모리입니다.내 테스트에서,이러한 기능은 무척 빠르고,esp.계정으로 보호가 그들은 당신에.

다른 시스템에서는 내가 사용하고 복어 이후 그것은 좋은 사 속도와 힘이 있습니다.후자의 경우에,당신은 임의로 생성하는 당신의 자신의 비밀번호(16+의 바이트 엔트로피를 위한 복어)프로그램을 시작합니다.불행하게도 없는 많은 보호할 수 있는 암호 OS 없이 지원하지만,사용할 수 있습니다 일반적인 난독 기술을 포함하는 하드 코딩된 소금의 값으로 실행된 결합할 수 있습니다 암호(모든 조금 도움).

전반적으로,이 전략의 한 부분입니는 광범위한 심층 접근 방식이다.또한 유지 하는 마음에 간단한 버그와 같이 버퍼는 오버플로지 소독 프로그램 입력을 유지하여 지금까지 가장 일반적인 공격.

자를 보호할 메모리의 내용을 소유자의 시스템입니다.할리우드와 음악 산업에 대한 갈망이다.가능하면,그들은 이미 그 일을하고 있습니다.

이 있을 살펴 Vista(위) 보호된 프로세스 (직접 .다운로드 doc).나는 운영 체제 적용되는 보호의 엔터테인먼트 산업합니다.

@Derek:아,그러나 신뢰할 수 있는 컴퓨팅을 사용할 수 있습니다 메모리 curtaining!:-P</devils-advocate>

@roo

정말로 하는 것이 가능했고,나는 그냥하지 않았을 발견했습니다.귀하의 예를 그냥 나를 깨닫는 것입니다 정확히 우리가 무엇을 하려고 하지만 액세스를 허용하는 파일의 컨텍스트에서 저희 프로그램과도록을 보존합니다.

나이 있을 받아들이 없다는 것을 진정으로 안전하게 저장하는 방법을 사람의 파일을 다른 컴퓨터에서,특히 경우 어떤 시점에서 액세스를 허용하는 파일의 소유자에 의해 보호됩니다.

는 확실히 문제입니다.저장할 수 있는 뭔가로 안전하게 그래서 당신이 결코 액세스 권한을 부여하지만,곧 당신은에 액세스 권한을 부여하 제어는 사라졌다.당신은 그것을 만들 수 있고 조금 더 어려운,그러나는 것입니다.

@크리

아,그러나 신뢰할 수 있는 컴퓨팅을 사용할 수 있는 메모리 curtaining!:-P

하지만 당신은 실제로 기꺼이 지불하는 컴퓨터에 대해 다른 사람이 소유하고 있습니다.p

@데릭 공원

그는 말했다,열심히 불가능하지 않습니다.PGP 것을 어렵게 만들지 않는 것이 불가능합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top