2017-01-08 9 views
7

.Net security noob here ... 다른 사람이 내 어셈블리를로드하지 못하게하는 가장 간단한 방법은 무엇입니까?누군가가 내 관리되는 어셈블리를로드하지 못하도록하는 가장 간단한 방법은 무엇입니까?

배경 : 실제로 충분한 '보호'(충분한 시간/돈/현물로 누군가가 성공적으로 해킹하고 해킹 할 수 있음)를 찾고 있지만 이것이 이미 해결 된 문제인 것처럼 보입니다. 방금 그것을 놓쳤습니다. 강력한 이름은 보안 계층을 사용할 수 있습니다

  1. 하지만, 반드시 의도 (경고 참조 this microsoft documentation에 따라하지 않았다 : 여기

    내가 알고 내가 (생각) 무엇을합니까 하지 보안을 위해 강력한 이름에 의존하고있다. 그들은 단지 고유 ID를 제공합니다.) 내가 부하 타사 어셈블리 (Aspose 내가 그것을 생각) 때문에 할 수 없습니다 어디 상황이 발생했을 그^노트에

    그들은 그들의 집회에 서명하지 않았다. 그러나 모든 것은 내 것이 었습니다. 그래서 나는 ildasm 그들의 집회에 우리 자신의 콧수염으로 서명하고, 다시 ilasm으로) 에서 주문했다. 따라서 강력한 이름 지정은 나에게 좋은 보안 메커니즘 인 처럼 보이지 않습니다.HOWEVER ... 코드가 인 간단한 확인은 호출 어셈블리가 내 공개 키 토큰으로 서명되어 있는지 확인하려면 어떻게해야합니까? 이 효과가 충분합니까?

  2. 강력한 명명 내가 dll을 더 나은 경로 (wintrust.dll을이와 을 도울 수있는 것 같다)에 인증 코드 디지털 서명 확인 을 구현하고, 달성 에 노력하고있어 사용하지 않아야하는 경우?

    나는 난독 화를 위해 여러 공급 업체의 툴링 을 사용하고 있으며 많은 사람들이 라이센스와 모든 종류의 것들을 제공합니다. 나는 가능성이 은 문자열과 코드 암호화로 기능을 사용하지 않고, 그러나 난 아직도 내 민감한 라이브러리를로드하지 사람을 방지하기위한 메커니즘을하고 싶은 몇 가지 민감한 부품을 숨길 난독의 약간을 사용합니다 , 종종 성능 (및 기타) 비용이 부과됩니다.

    그래서 다시 질문에

, 내 어셈블리를로드에서 사람을 방지하기 위해 간단한 방법은 무엇입니까?

+0

투표 마감을위한 투표가 있었습니까? 그렇다면 왜? 어쩌면 이것이 대답 된 곳으로 나를 가리킬 수 있습니다. 가능한 뭔가를 이미 놓쳤습니다. 또는 실제로 이것이 실제로 효과적으로 응답되지 않았 음을 나타낼 수도 있습니다. – JohnZaj

+0

"로드 금지"란 정확히 무엇을 의미합니까? 일반적인 경우 어셈블리가 다른 어떤 것과 마찬가지로 불투명 한 파일이기 때문에 불가능합니다. 가능하면 어셈블리 내의 .NET 코드가 실행되지 못하게하거나 내부의 항목을 숨길 수 있습니다. 추신 : 당신이 알았 듯이, 강력한 명명은 식별에 관한 것입니다. 어셈블리를 사직 할 때 더 이상 같은 게시자가 아닙니다. 해당 어셈블리에 게시자를 확인하는 코드가 포함되어있는 경우 내부의 코드가 해당 코드를 사용하여 액션 과정을 변경할 수 있지만 여전히 어셈블리를로드 할 수 있습니다. –

+0

당신은 당신을 멈추려 고합니다 .Net dll은 COM으로 읽을 수 있습니까? – TechLiam

답변

2

분명하지만 도움이되지 않을 수도 있습니다. 가장 간단한 방법은 어셈블리를 삭제하는 것입니다.

+0

그래, 좋은 답변. 그러나 보안의 일부는 여전히 유용 할 필요가 있다는 것입니다. 물론, 기존의 것을 보호하는 가장 좋은 방법은 바다 바닥의 자물쇠 상자에 넣는 것입니다. 그러나 사용할 수 없다면 보안 요구 사항을 충족하지 못합니다. 사용 가능 : – JohnZaj

2

당신이 원하는 것은 리버스 엔지니어링을 사람들이 막는 것입니다, 그렇습니까? JustDecompiler 같은 도구를 사용하면 어셈블리 코드를 쉽게 얻을 수 있습니다. 코드를 난독 화하려면 유료 제품 (Eazfuscator) 또는 일부 오픈 소스 (Obfuscar 또는 ConfuserEx)를 사용해야합니다.

+1

이미이 작업을 수행하고 있습니다. 그러나 de4dotnet에는 모든 공급 업체의 난독 화 도구에 대한 모호한 제거 방법에 대한 기록이 있습니다. 나는 그것을 많이 테스트 해왔다. – JohnZaj

4

실제로 어셈블리를 악의적으로 다운로드하여 사용하지 않도록 100 % 보장 할 수는 없습니다.하지만 몇 가지 조치가 도움이 될 수 있습니다.

  1. 설치 패키지 서명 (msi). SSL 인증서가 필요합니다. 설치 과정에서 다운로드 한 파일의 게시자를 볼 수 있습니다. 설치 패키지가 수정 된 경우 사용자와 서명자가 깨지고 해당 앱이 알 수없는 게시자 또는 다른 게시자의 앱인 것으로 표시됩니다.
  2. 어셈블리 이름을 강력하게 지정하면 다른 "잘못된"라이브러리로 라이브러리를 대체하지 못하게 할 수 있습니다. 다음 시나리오를 고려해 보겠습니다. 라이브러리 A가있는 앱을 일부 서버 또는 자신의 컴퓨터에 앱을 설치 한 사용자에게 배포했습니다. 강력한 이름이 없으면 라이브러리 A 또는 다른 라이브러리를 다른 코드로 대체하거나 수정할 수 있습니다. 예를 들어,이 새로운 버전은 모든 사용자 암호를 어딘가에서 전송하거나 다른 악의적 인 동작을 수행 할 수 있습니다. 한 라이브러리가 .Net을 다운로드하는 동안 변경되면 강력한 이름 유효성 검사 예외가 발생합니다. 따라서 앱이 고장납니다. 악성 코드가 앱을 작동 시키려면 모든 앱 라이브러리를 다시 컴파일해야합니다. 더 힘들어.
  3. 난독 화는 어셈블리 내부에서 일어나는 일들 (코드 이름 변경, 문자열 암호화 등)을 매우 어렵게 또는 불가능하게 이해할 수있게 해주는 매우 중요한 것입니다.
  4. 매우 중요한 지적 코드가 있으면 기본 (C/C++) 코드로 다시 작성하는 것이 좋습니다.
  5. 앱이 모바일 또는 데스크톱 앱이고 백엔드 요청을하는 경우 중요한 코드를 서버 측으로 옮길 수 있습니다.
+0

첫 번째 요점 : 필자는 항상 MSI와 부트 스트 래퍼 등을 사용하여 작업을 수행했습니다. 어셈블리/파일에 서명하는 디지털 서명이 호출 할 수 없게 만드는 경로가 될 것이라고 제안하십니까? 불가능하다)? – JohnZaj

+0

디지털 서명을 통해 파일 게시자 만 식별 할 수 있습니다. 따라서 설치하는 동안 Microsoft 사이트에서 msi 또는 exe를 다운로드하면 Microsoft 회사가 확인 된 게시자로 표시됩니다. 그게 전부 야. –

+0

이렇게 말해 보겠습니다. 호출하는 어셈블리에 안전한 고유 식별자가 없으면 호출자가 내 어셈블리에서 특정 작업을 수행하지 못하도록하는 메커니즘을 넣었습니다.이 고유 식별자를 어셈블리의 디지털 서명으로 만드는 것이 낫습니다. 부름을? 아니면 강력한 이름 키? 나는 나중에 생각하고있다. – JohnZaj

1

하나의 옵션 (가능할 수도 있고 그렇지 않을 수도 있음)은 어셈블리를 제공하지 않을 수도 있습니다. 웹 기반 응용 프로그램 (예 : Software as a Service)을 만들 수있는 경우 클라이언트를 적절히 보호하면 클라이언트에 액세스 할 수 없습니다.

+1

올바른 것으로, 이는 보안이 제대로 설정된 서버 뒤에있는 경우가 대부분입니다. 그러나 가능성은 낮지 만, 어셈블리가 의도하지 않은 사람의 손에 들어가는 것은 불가능하지 않습니다. 보기 1 : 불만을 품은 직원. – JohnZaj

+0

@JohnZaj 이것이 위협 모델의 일부라면 올바른 것입니다. – TrueWill