프로덕션 환경에서 디버그 기호 (pdb 파일)를 배포하면 어떤 위험이 있습니까?


81

예외 strack 추적을 기록하는 응용 프로그램이 있으며 프로덕션에 배포 할 때 해당 스택 추적에 파일 이름과 줄 번호를 포함하고 싶었습니다. 어셈블리와 함께 디버그 기호를 배포하는 방법을 알아 냈지만 문제를 조사하는 과정 에서이 질문을 건너 뛰었습니다 . 이는 프로덕션 환경에 pdb 파일을 포함하는 것이 좋지 않음을 의미합니다. 허용 된 답변에 대한 의견은 "... 정보를 디버깅하면 민감한 데이터를 제공 할 수 있으며 공격 벡터가 될 수 있습니다. 앱이 무엇인지에 따라 다릅니다."

그렇다면 어떤 종류의 민감한 데이터가 노출 될 수 있습니까? 애플리케이션을 손상시키기 위해 디버그 기호를 어떻게 사용할 수 있습니까? 기술적 인 세부 사항에 대해 궁금합니다.하지만 제가 정말로 찾고있는 것은 주어진 응용 프로그램 및 프로덕션 환경에 대한 디버그 기호를 포함하는 위험을 평가하는 실용적인 방법입니다. 또는 다른 말로하면, 일어날 수있는 최악의 상황은 무엇일까요?

수정 : 후속 질문 / 설명

따라서 지금까지 모든 사람의 답변을 바탕으로 .NET 응용 프로그램에서는이 질문을 약간 단순화 할 수있는 것 같습니다. Michael Maddox의 답변에 링크 된 John Robbins 블로그 에서이 비트 는 나에게 도약했습니다.

.NET PDB에는 소스 파일 이름과 해당 행 및 로컬 변수 이름의 두 가지 정보 만 포함됩니다. 다른 모든 정보는 이미 .NET 메타 데이터에 있으므로 PDB 파일에서 동일한 정보를 복제 할 필요가 없습니다.

나에게 이것은 Reflector에 대해 다른 사람들이 말하는 것을 반복하며, 실제 문제는 어셈블리에 대한 액세스라는 의미입니다. 이것이 결정되면 PDB와 관련하여 내려야 할 유일한 결정은 파일 이름, 줄 번호 및 로컬 변수 이름을 노출하는 데 관심이 있는지 여부입니다 (시작하기 위해 최종 사용자에게 스택 추적을 표시하지 않는다고 가정). 아니면 너무 많이 단순화 했나요?


@Matt : 이것은 데스크톱 응용 프로그램, 웹, 컴팩트 또는 ...?
Kb.

@Kb-이 특별한 경우에는 스케줄러로 실행하는 콘솔 앱입니다. 내부 사용을 위해 사내에서 개발 되었기 때문에 pdb 파일을 볼 수있는 사람이라면 누구나 소스 코드를 볼 수있을 것이므로이 특정 앱에 대해별로 걱정하지 않습니다. 저는 일반 / 실제 사례에 더 관심이있어서 다른 앱으로 위험을 감수 할 것인지 여부를 결정할 수 있습니다 (예 : 네트워크의 민감한 데이터에 가끔 연결되는 랩톱에 설치된 데스크탑 앱).
Matt

답변:


58

살펴볼 또 다른 질문이 있습니다.

라이브 서버에 PDB 디버그 파일을 남기는 보안 문제가 있습니까?

PDB 파일에 대한 추가 정보 :

PDB 파일 : 모든 개발자가 알아야 할 사항

일반적으로 배포시 항상 pdb 파일을 포함하고 있지만 그 이득은 무시하기에는 너무 큽니다.

사용자에게 스택 추적을 노출하지 않는 경우 (일반적으로 그렇게해서는 안 됨) PDB 파일 배포에 대한 추가 보안 위험이 없습니다.

사용자에게 보이는 스택 추적이 발생하면 사용자는 파일 이름과 파일 줄 번호를 포함한 전체 스택 추적을 볼 수 있습니다. 이를 통해 해킹시 잠재적으로 도움이 될 수있는 앱 설계 방식에 대한 아이디어를 얻을 수 있습니다.

더 큰 보안 위협은 Reflector 와 같은 것으로 DLL에 사용될 때 pdb 파일의 유무에 관계없이 소스 코드를 볼 수 있습니다.


3
링크 주셔서 감사합니다. 따라서 방정식의 적어도 일부 는 응용 프로그램이 배포 되는 위치 (예 : 데스크톱 대 웹 서버) 인 것 같습니다.
Matt

15

자체 조직의 프로덕션 환경에 배포하는 경우 보안 문제가 아닙니다.

소프트웨어를 다른 기관에 판매하는 경우 .pdb 파일은 리버스 엔지니어링에 관심이있는 사람에게 문제가 될 수도 있고 그렇지 않을 수도 있습니다.

그러나 (명확하게 말하면) .pdb를 사용할 수 있는지 여부에 관계없이 스택 추적이 클라이언트에 표시되는 것을 원하지 않습니다. 그러나 추적을 기록하고 클라이언트에게 '예쁜'오류 페이지를 표시하는 경우 문제가되지 않습니다.


나는 Matt가 .Net에 대해 이야기하고 있다고 믿습니다. Lutz의 Reflector와 같은 도구를 통해 아직 사용할 수없는 PDB에서 얻을 수있는 추가 정보는 무엇입니까?
Lars Truijens

소스 및 라인 정보가 즉시 떠 오릅니다. 메타 데이터에 지역 변수 이름이 있다고 생각하지 않습니다.
Michael

@Lars-나는 그것이 도움이 될 것이라고 결코 말하지 않았다 :) 나는 PDB와 리버스 엔지니어링에 대한이 모든 두려움이 매우 잘못되었다고 생각합니다. 리버스 엔지니어링에 PDB를 사용할 수있는 사람은 주석을 지원하는 괜찮은 디스어셈블러를 사용할 수 있습니다.
Michael

1
매우 긴 메서드의 로컬 변수 이름이 리버스 엔지니어링에 어떻게 도움이되는지 알 수 있지만 소스 파일 이름과 줄 정보는 무엇입니까? 당신이 저를 요구하는 경우에 :) 리플렉터와 같은 도구를 비교하지 실제 위험
라스 Truijens

1
@Lars-Michael Maddox와 제가 말하는 것을 표현하는 또 다른 방법은 어셈블리를 보유한 사람에게 .pdb를 제공하는 것이 보안 위험이 아닌 경우가 많다는 것입니다. assmeblies가없는 사람이 스택 추적을 사용할 수 있도록하는 것이 가능할 수 있습니다.
Michael Burr

11

디버깅 기호를 사용하여 공격자는 관심있는 전역 변수, 함수 오프셋 등을 결정할 수 있습니다.

따라서 그는 시스템에 다음과 같은 기능이 있음을 알 수 있습니다.

AddAdminUser(string name, string password);

그리고 그것의 오프셋을 알고 있습니다. 프로그램이 손상되면이 함수를 호출하여 관리자 권한을 부여 할 수 있습니다.

또는 다음과 같습니다.

typedef enum {Basic, NTLM} AuthenticationMode;
AuthenticationMode g_authenticationMode;

그리고 애플리케이션을 안전하지 않은 모드로 전환하기 위해 어떤 비트를 뒤집어 야하는지 알고 있습니다.

또는이를 파악하는 데 상당한 리버스 엔지니어링 시간이 소요됩니다. 그러나 극복 할 수없는 시간은 아닙니다.

하지만. . . 이 모든 것은 공격자가 이미 프로그램을 손상시킬 수있는 위치에 있음을 의미합니다. 그렇다면 이미 패배 한 것입니다.

pdb 기호를 배포해야하는 비즈니스 이유가 있다면 계속 진행하십시오. PDB를 배포해도 안전하지 않습니다. 배포 할 타당한 이유가없는 경우 공격이 약간 더 쉬워 지므로 이렇게하면 안됩니다.

공개 PDB 파일을 만들 수도 있습니다. 이러한 파일은 특정 정보를 제거하지만 스택 추적을 생성하고 기본 디버깅을 수행 할 수있는 충분한 기호를 제공합니다. 자세한 내용은 여기에 있습니다 . Microsoft는 모두가 사용할 수 있도록 심볼 서버에 공용 PDB를 배포합니다.

편집 : 내가 말한 대부분은 네이티브 코드 용 PDB 배포에 대한 우려에 적용됩니다. 어셈블리 메타 데이터가 이미 상당 부분을 전달하고 있음에도 불구하고 사람들이 .NET에도 이러한 우려를 전달한다고 생각합니다.


6
나는 Matt가 .Net에 대해 이야기하고 있다고 믿습니다. PDB 없이도 Lutz의 Reflector와 같은 도구에서 모든 소스를 이미 얻을 수 있습니다.
Lars Truijens

@Lars-대부분이 네이티브 코드임을 알리기 위해 내 의견을 업데이트했습니다. 나는 많은 사람들이 PDB가 리버스 엔지니어링을 가능하게한다는 비합리적인 두려움을 가지고 있다고 생각하며 공격자들은 IDA Pro와 같은 디스어셈블러를 사용하는 방법을 모른다고 생각합니다. 이러한 두려움이 관리 코드에도 잘못 반영되었다고 생각합니다.
Michael

2

누군가 애플리케이션의 전체 소스 코드를 "복원"할 수 있습니다. 오픈 소스라면 걱정할 필요가 없습니다. IP (알고리즘, 보호, 라이센스)가 있다면 좋은 생각이 아닐 것입니다.

Reflector와 같은 도구가 PDB 파일 없이도 코드의 일부를 재구성 할 수 있다는 것은 사실이지만 난독 화가 도움이 될 수 있습니다 (음, 조금만).


1
나는 Matt가 .Net에 대해 이야기하고 있다고 믿습니다. PDB 없이도 Lutz Reflector와 같은 도구에서 모든 소스를 이미 얻을 수 있습니다.
Lars Truijens

Lars, 저는 완전히 동의합니다. Reflector는 리버스 엔지니어링을위한 훌륭한 도구입니다. 그러나 때로는 결과 코드를 읽을 수없는 경우가 있습니다. 특히 소스가 난독 화 된 경우 더욱 그렇습니다. PDB 파일은 삶을 더 좋게 만들 것입니다.
db_ 09-08-20
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.