동료 프로그래머는 최악의 프로그래밍 방법을 사용했습니다.


37

말이 이상한 것 같지만 직장 동료 프로그래머가 의도적으로 몇 가지 나쁜 프로그래밍 방법을 의도적으로 사용했습니다! 설명하겠습니다. 먼저 그가 똑똑한 사람이라고 말하고 대부분은 이해할 수없는 코드를 작성합니다.

Java로 작성된 웹 응용 프로그램 프로젝트에 라이센스를 구현하라는 요청을 받았습니다. Java이기 때문에 실제로 원한다면 항아리를 열고 내부에 작성된 클래스와 메소드의 이름을 읽을 수 있습니다. 이 문제에 대한 그의 해결책은 말 그대로 변수와 메소드를 명확하지 않은 이름으로 부르고 새로운 클래스를 생성하는 대신 이미 혼잡 한 클래스에 심는 것입니다.

그의 해리는 해커가 라이센스 검사를 우회하기 위해 특정 클래스를 바꾸고 싶을 때 (따라서 제품의 무료 사본을 얻으려면) 어떤 방법이 명확하지 않은 경우 훨씬 어려운 시간을 보냈다는 것이 그의 정당화였습니다 이러한 특정 작업을 수행하십시오. 그가 그렇게 한 후에야 나는 그것에 대해 그것에 대해 대면했고, 우리는 아마도 좋은 프로그래밍 관행을 유지하면서 우리를 위해 일종의 난독 화 라이브러리를 구입할 수 있다고 제안했다. 그는 그런 종류의 해결책을 찾을 시간이나 자원이 없다고 주장한다.

.. 나를 딜레마에 남겨둔다. Java에서 obfuscator 라이브러리를 찾아서 이전 코드 (코드를 리모델링하는 것이 약간 어려울 수 있음)를 수정합니까, 아니면 끝이 나지 않는 한 그대로 두어야합니까?


4
귀하의 질문 이이 상황의 정치를 다루는 방법에 관한 것이라면, 여기의 많은 답변이 올바른 방향을 가리키고 있지만 귀하의 의견에 따르면 제안하는 더 나은 대안을 원한다면 확인하고 싶을 것입니다 이 질문에 대한 답변 답변 : stackoverflow.com/questions/6018215/…
Mark Booth

8
깨끗한 소스 코드에 액세스 할 수있는 해커가 인증을 해킹 할 수 있으면 해킹 할 수있는 기간입니다. 난독 화가 도움이되지 않습니다. 일부 해커를 차단하는 솔루션을 따르는 경우 난독 화 외에도 그의 잘못된 방향 관행을 사용하고 싶을 수도 있습니다 (쉽게 교체 할 수없는 클래스에서는 숨기기). 인증 방식을 완전히 바꾸는 빈번한 업데이트도 도움이됩니다. 많은 사용자가 해커에 의존하는 것에 질려서 구매하는 경우가 많습니다.
Bill K

2
그는 지역 이름을 바꾸고 있었습니까? 그렇다면 그는 시간을 낭비하고 있습니다-어쨌든 컴파일 된 코드에는 명명 된 변수로 존재하지 않습니다.
닉 존슨

1
그것은 "난독 화"라고 불리우며 요즘 더 자주 사용되지만 완전히 증명되지는 않습니다! 객체 코드를 암호화하고 올바른 키로 만 실행할 수 있으므로 디스크 편집기, 디스어셈블러 또는 기타 크래킹 도구를 사용하는 사람도 절대로 머리 나 꼬리를 만들 수 없습니다!
Frank R.

6
"이 문제에 대한 그의 해결책은 문자 그대로 변수와 메소드를 명확하지 않은 이름으로 부르고 새로운 클래스를 생성하지 않고 이미 혼잡 한 클래스 안에 심는 것입니다." 그리고 "먼저 그가 똑똑한 사람이라고하자"는 같은 단락에서 잘 진행되지 않습니다!
삼켜 elysium

답변:


94

난독 화를 통한 보안은 결코 좋은 보안이 아닙니다. 지적 재산을 보호하는 더 나은 방법이 있어야합니다. 그리고 그것이 귀하와 귀하의 동료가 귀하의 관리자와 공동 관심사로 제기해야하는 것입니다. 경영진이 보안 향상에 시간이나 돈을 쓰고 싶지 않다고 결정하면 두 사람 모두 그 결정에 따라야하며 (제품이 아니라 회사 제품 임) 낭비하지 않는 것이 좋습니다 (폐기물?) 더 이상 주제에 대해.


31
+1 난독 화는 보안이 아니라 편안한 담요입니다.
uɐɪ

7
난독 처리보다 더 나은 해결책을 제시 할 수 있다면 정답으로 표시하겠습니다. war 파일에 액세스 할 수있는 사람이 라이센스와 관련된 최소한의 기능을 수정할 수 없도록하려면 어떻게해야합니까?
Neil

5
누군가 파일에 액세스 할 수있는 경우이를 보증 할 수 없습니다. 그러나 진실은 다음과 같습니다. 가장 간단한 메커니즘으로 99,99 %의 사용자가 소프트웨어에 해를 끼치 지 않습니다. 전문적이고 숙련 된 해커는 항상 애플리케이션 보안을 우회 할 방법을 찾습니다. 그러나 원격 검증으로 전환 할 수 있으므로 귀하의 서비스에 대해 인증 된 경우에만 프로그램이 실행됩니다. 보안을 유지하려면 전체 프로그램을 암호화하고 일종의 부트 로더가 있어야합니다. 그러나 누군가가 유효한 키를 가지고 있다면 어쨌든 소프트웨어를 다시 리버스 엔지니어링 할 수 있습니다.
팔콘

7
@Neil : USB 동글로 연결된 마이크로 컨트롤러에서 핵심 비즈니스 로직을 구현합니다. 당신은 그것이 저렴하거나 구현하기 쉽다고 말하지 않았다;)
SF.

8
@SF .: 터치. 나는 그저 지옥을 위해서도 동시에 연결하기 위해서는 세 개의 위성이 필요하다고 생각합니다. ;)
Neil

84

원본 : 상사는 무엇을 말합니까? 알아보십시오-그렇게하십시오.


위의 내용을 자세히 설명했습니다.

우선, 나는 당신이 하나 이상의 딜레마를 가지고 있다고 생각합니다.

  • 다른 사람 코드를 "수정"해야합니까?
  • 다른 사람의 구현 (여기에서 A)이 다른 것으로 대체되어야하기에 충분하지 않습니까?
  • 이 "응용 프로그램에 포함 된 라이센스"에 대해 난 독자 (여기서는 B)가 더 좋습니까?

우선, 문제는 비즈니스의 경우에서 본 IS 해결. A가 있고 문제에 대한 "충분한"솔루션 일 가능성이 높습니다. 당신의 회사는 기본적으로 그것을 보호하기 위해 의도적 인 노력이 필요할 정도로 충분히 보호되어있는 것에 만족할 수도 있습니다.

이것은 당신이 그것을 싫어하더라도 (그리고 나를 믿으면, 당신의 경력을 통해 훨씬 더 나빠질 것입니다) 그것은 필요한 일을한다는 것을 의미합니다. 따라서 문제가 해결되면 "그냥 해"하지 말고 업무를 담당하는 사람에게 장기적으로이 구현의 가격은 롤백을 보장하고 주식 난 독자를 선택하기에 충분히 높을 것입니다. 이를 위해서는 약간의 준비가 필요하며, 난독 처리자는 단점이 있으므로 알아야 할 다른 단점도 있습니다 (다른 답변도 잘 설명). 예를 들어, 스택 트레이스를 즉시 사용할 수있는 것은 아닙니다. 모두 해적을 피하는 것이 얼마나 중요한지에 달려 있습니다. 가장 깨지기 어려운 것은 하드웨어 동글을 실행해야하며 고객이 원하는 것보다 훨씬 비쌉니다.

따라서,이 결정은 당신이 당신의 회사의 요구가 B로 이동하기 위해 추가 리소스를 사용 그러므로 당신이 책임이있는 사람에게 우려를 가져올 필요가 이것과 다른 설명으로 만들하지 않는 것입니다 장기 충분히 그 이유를 이해하기 위해 관심을 당신은 당신의 제안보다 열등하다고 생각합니다. 그런 다음 결정을 내릴 수 있도록하고 결정이 무엇인지에 관계없이 존중 하고 전문적인 방식으로 행동하십시오. 원저자는 저자가 글을 쓸 때 어쨌든 유지해야 할 가능성이 높으며, 더 이상 떠나거나 원하지 않으면 문제를 다시 제기 할 수 있습니다.

다시 말해 , 상사는 무엇을 말합니까? 알아보십시오-그렇게하십시오.

또한 문제를 더 일찍 제기하여 A를 구현하는 데 소요되는 시간 동안 낭비되는 비용이 더 작을 경우에는 달라졌을 것입니다. 즉, A와 B 사이 에서 선택해야 할 때 .

마지막으로 "다른 사람들의 코드 만 수정"에 대한 귀하의 질문에 대해 언급하고 싶습니다. 이것은 기존 코드에 대한 작은 수정이 아닙니다 (특히 테스트가 진행되는 동안 좋습니다. 이는 롤백 및 재 구현을 방해하며 공통 코드 소유권을 가진 팀에서도 사전 승인 없이는 할 수없는 일입니다.

바라건대 이것은 내 견해를 분명히합니다.


8
내 상사는 프로그래머가 아니기 때문에 아마도 프로그램의 동작을 어떤 식 으로든 변경하지 않는 일에 시간과 돈을 투자해야하는 이유를 설명하는 데 어려움을 겪었을 것입니다.
Neil

15
@Neil : ... 그래서 상사에게 "유지 보수 비용"이라는 개념을 소개 할 때가 되었습니까?
SF.

21
이것이 동료 나 작업 환경에 대한 모든 단일 질문에 대한 기본 응답이 될 것입니까? 나는 일부 마비가 가서 답으로 이것을 게시하도록 지시해야한다는 것을 알고 있지만 , 대답 은 아닙니다 . 이것은 실제로 모호함을 통한 보안 문제에 대한 반쯤 괜찮은 질문입니다. 이 "답변"은 모욕적입니다.
Aaronaught

8
@Aaronaught. 이 답변은 "구현 A가 나쁘면 구현 B를 수행하는 것이 좋습니다"라는 추가 작업 (동일한 돈)을 수행해야하므로 뼈가 잘립니다. A 또는 B 구현 중 하나를 선택했다면 그 대답은 달라졌을 것입니다. 좀 더 자세한 답변을 원한다면 메타에 대한 질문을 하시길 권합니다.

22
"동료 나 직장 환경에 대한 모든 단일 질문에 대한 기본 응답이 될 것입니까?" 왜 안돼? 이것이 기술적 인 질문으로 표현 된 경우, 예를 들어 "누가 더 나은 자동 난독 화 v의 수작업으로 코딩 된 (= 나쁜 연습) 난독 화"라면 그것은 완전히 다른 질문이며 기술적 인 논의를 보증합니다. 모두 "동료 뒤에이 문제를 해결해야합니까?" 질문은 궁극적으로 "아니오, 팀 / 더 높은 힘의주의를 끌도록"으로 정리됩니다
Binary Worrier

13

Java에서 obfuscator 라이브러리를 찾아서 이전 코드 (코드를 리모델링하는 것이 약간 어려울 수 있음)를 수정합니까, 아니면 끝이 나지 않는 한 그대로 두어야합니까?

아니요 , 누군가를 되돌아 가서 그들이 담당하는 코드를 변경하는 것은 의심스러운 코드를 작성하는 것보다 더 나쁜 범죄입니다.

당신은 프로그래머와 함께 그것을 가지고 왔고, 다음 단계는 코를 코에서 멀리하거나 관리와 함께 코를 가져 와서 코에서 멀리하는 것입니다.


그런 다음 앞으로이 수업을 통해 낚시를한다면 코를 잡고있을 것입니다.
Neil

3
해당 코드에 대한 직접적인 책임이있는 경우 코드를 원하는대로 변경하는 것이 좋지만 공동 책임이있는 경우 중재 할 사람이 필요합니다. 이와 같은 상황에서 작업 관계를 손상시키고 시간을 낭비하는 것은 쉽습니다. 가능하면 문제를 일으키지 않는 것이 좋습니다. 문제가 발생하면 최대한 빨리 해결하십시오.
DKnight

6

어떤 종류의 공식 코드 검토가 있었습니까? 아니면 비공식적 인 "코드 검토"가 있었습니까? 보안 및 라이센싱과 같이 섬세하고 중요한 주제이기 때문에이를 체인으로 끌어 올려야합니다. 첫 번째 부분은 프로그래머와 대면하는 것입니다. 그러나 이제 그가 듣지 않고 있으므로 들어 올려야합니다. 그렇지 않으면 문제의 일부일 수 있습니다.

나는 당신이 그것을 할 것이라고 그에게 말할 것입니다-이것은 그의 마음을 바꿀 수 있습니다. 그렇지 않은 경우 상사에게 상황에 대해 매우 정치적으로 정확하지만 정확하고 간결한 이메일을 작성하고 프로그래머에게 문의하십시오. 이메일에서 세 사람 및 / 또는 다른 참여 당사자 간의 회의를 요청하십시오.

정치적, 우호적 인 방식으로 항상 이러한 것들을 만나십시오.


확실히 훌륭한 접근 방식입니다. SVN에서 코드를 업데이트하면서 코드 수정을 직접 확인했습니다. 그가 동의하지 않을 경우 기회는 있지만, 상사가 이러한 보안 예방 조치를 취하도록 설득하는 것은 프로그래머가 이미 '작동'한다고 주장 할 수 있기 때문에 아무런 변화가 없을 것입니다.
Neil

2

클래스의 서명 (메소드 이름 등)을 난독화할 수있는 난독 화 장치를 찾을 수 있다면이를 구입하여 사용하도록 제안하십시오.

그때까지, 당신은 그것과 함께 살아야 할 수도 있습니다. 최근 Grails 프로젝트에서 비슷한 작업을 수행한다는 점을 인정합니다. 라이센스 검사는 이미 큰 로그인 방법에 의도적으로 포함되어 있으므로 검사를 우회하기 위해 방법을 대체하기가 매우 어렵습니다.


1
나는 당신이 아마 그것과 함께 살아야 할 것이 맞지만, 나를 얼마나 귀찮게하는지는 말할 수 없다.
Neil

2

그는 그러한 핵이 실현 가능하다는 것을 증명할 수 있습니까, 아니면 그가 걱정하는 가상의 시나리오일까요? 그는이 작업의 라이브 데모를 제공 할 수 있습니까? 그는 시도해야한다. 진심으로. 그것이 효과가 있다면 경영진에게 제시하고 난 독자를 얻는 것이 좋습니다.

obfuscator가 충분히 안전하지 않은 경우 JAR을 보호하는 다른 방법 (예 : 암호화 또는 원시 코드로 컴파일)을 조사 했습니까?

RE : 코드 재 작업 : 이름 변경 문제입니까? 많은 IDE에는이를 쉽게 수행 할 수있는 리팩토링 도구가 있습니다.


비록 내가 이유를 볼 수 있지만 그는 나를 약간 편집증으로 공격합니다. 제품이 해킹당한 경우 아마도 그의 직업을 의미했을 것입니다. 나는 그것이 가능하다고 말하지는 않지만, 메소드 이름을 찾을 수있는 방법을 알기에 충분히 알고 있으며 "isLicenseValid"라는 명백한 메소드가 있다면이 메소드를 가지고 항상 true를 반환하는 클래스를 작성하는 문제가 될 것입니다. '해킹'. 나는이 프로그램이 더 복잡하지 않고 충분히 복잡하다고 생각하지만 확신하기를 원합니다. 이름을 바꾸면 코드를 쉽게 고칠 수 있다고 생각합니다.
Neil

"isLicenseValid"라는 메소드가 있다고해서 동일한 메소드로 클래스를 작성하여 해킹 할 수있는 것은 아닙니다. 클래스를 "봉인"(C # 구문)으로 표시하면 타사는 하위 클래스를 작성하고 메서드를 재정 의하여 보안 검사를 우회 할 수 없습니다. 어쨌든,이 사람이 회사의 보안 책임자가 아니라면 왜 제품이 해킹 당했을 때 그의 직무를 의미할까요?
Tundey

2
@Tundey, 그것은 서브 클래스의 문제가 아닙니다 (로드되는 방법은 무엇입니까?) : 동일한 클래스 를 작성 하고 해킹 된 버전을 클래스 경로 검색 목록에 일찍 넣는 문제입니다 .
피터 테일러

1
ha. Java에서 클래스 로딩의 기쁨을 기억합니다. 그래도이를 방지 할 수있는 더 좋은 방법이 있어야합니다. 실제로 클래스 로더가 손상되지 않으면 누군가 클래스와 동일한 클래스를 어떻게 작성할 수 있습니까? 특히 JAR에 서명 한 경우? JAR에 서명하고 클래스를 봉인하지 않으면 누군가와 같은 이름의 클래스를 작성하는 문제가 해결되지 않습니까?
Tundey

1
@ 썬 JVM은 대부분 오픈 소스이므로 수정할 수 있습니다.
Spudd86

2

IP의 가치에 관계없이 지능적인 것은 혼란스러운 해커의 희망으로 코드를 엉망으로 만들지 않습니다. 앞으로 계속 유지하는 것이 악몽이라는 사실 외에도 실제로 문제를 해결하지는 못합니다. 그것은 어렵지만 불가능하지는 않습니다. 따라서 실제로 해결책이 아니며 부작용이 나쁩니다. 효과가없고 부작용이있는 약을 복용하는 것과 같습니다.

문제는 IP를 보호하는 방법입니다. 난 독자, 라이센스 서버 등을위한 솔루션을 찾으십시오.


110 % 동의합니다. IP 보안과 관련하여 중요한 점은 웹 클라이언트가 아닌 웹 응용 프로그램을 실행하는 컴퓨터이기 때문에 클라이언트가 안전하게 지키는 것입니다. 나는 기계에서 우리 제품에 직접 액세스 할 수있는 고객과 더 관심이 있었고 그것을 선택할 수 있습니다. 라이센스 서버는 클라이언트 측 보안만큼 좋습니다. 라이센스 서버 액세스를 우회 할 수있는 경우,이 책의 트릭으로 인해 라이센스가없는 프로그램을 사용할 수 없습니다.
Neil

1

다른 개발자는 우리의 암호화 / 복호화 루틴을 명명 할 때 나는 비슷한 문제로 실행 str__copy하고 str__delete(두 번째 밑줄을 알). 불충분했고 더 잘할 수 있었기 때문에 라이센스 업데이트가 필요한 이야기가 생길 때까지 기다렸습니다. "다음에 라이센싱을 할 때 정리하면 시간이 덜 걸리고 더 안전 할 것"이라고 설명했기 때문에 관리 팀은 추가 시간에 문제가 없었습니다. 문제는 해결되었고 상처는 없습니다.


물론 변경은 코드보다 더 중요해야한다고 생각하지만 나중에 언제든지 변경할 수 있습니다.
Neil

1
@Neil 그렇다면 당신은 머리의 변화를 필요로하는 사람입니다. 코드가 작동하고, 적절한 테스트를 받았으며, 난 독자를 사용하는 대신 해당 경로를 사용하는 것이 최선의 선택은 아니지만 세상의 종말이 아니라는 의견도 있습니다. 문제가 있으면 나중에 수정하고 그렇지 않으면 계속 진행하십시오.
Christopher Bibbs

@Christopher_Bibbs : 마음을 편하게하십시오. 나는 그것이 실제로 문제를 일으킬 것이라고 확신 할 수있다.
Neil

1

내 첫 번째 생각은 그 코드의 유지 관리였습니다. 코드가 이미 난독 처리되어 계속 진행된 경우 해당 코드를 처리하려고합니다. 그러면 코드를 해독하려는 해커가됩니다.

대신 코드를 정리하고 난독 처리기를 사용하여 모든 노력을 다하는 것이 좋습니다. 장기적으로는 관리하기 쉬운 코드가 많으며 라이센스를 해킹하려는 모든 사람에게 미친 복잡성을 남겨 둡니다.

난독 화가 완벽하지 않다는 것을 기억하십시오. 매우 결정된 해커는 아무것도 리버스 엔지니어링 할 수 있지만 최소한 그만이 될 것입니다. 또한 난독 화는 한 사람이 할 수있는 것보다 훨씬 더 복잡합니다.


0

나는 당신이 상사에게 문제에 대해 물어보고 그가 말한 것을해야한다는 답변에 크게 동의합니다.

그러나 이러한 답변에 대한 매우 중요한 부록은 보안 및 유지 관리성에 대한 우려 사항을 문서화해야한다는 것입니다. 코드 변경 여부에 관계없이 사람들이 관심사와 그 이유를 아는 것이 중요합니다. 이는 사전 예방 적으로 (상사가 자신이 알 필요조차없는 결정을 내릴 수 없음), 방어 적으로 (해커가 보안이 취약한 라이센싱 시스템에 구멍을 뚫을 경우 자신을 비난 할 수 없음) 중요합니다 잘못.)


0

"문제를 가장 잘 아는 전문가가되지 마십시오".

다시 말해, 상사에게 알리고 거기서 나가십시오. 당신이 조용히 유지하고 그 비밀의 토텀 폴의 꼭대기에 있다면, 밀기가 밀릴 때 당신은 책임을 질 것입니다. 상사에게 추월을 지시하고 접근 방법을 결정하게하십시오. 그렇게하면 선택의 짐을 덜 수 있습니다.

많은 관리자가 기술적 인 사람이 아니기 때문에 상사에게 말하지 말고 항상 우리가하는 일을하십시오. 문제와 가능한 해결책을 각 해결책의 장단점으로 제시하십시오. 그런 다음 결정을 내리고 통과 시키십시오. 관리자 / 리더가 큰 돈을 지불하는 이유입니다!


0

충분한 시간과 자원이 주어지면 무엇이든 금이 갈 수 있다는 것이 분명합니다. 앱의 인기도를 나타내는 간단한 기능입니다. 인기가 높을수록 숙련 된 해커가 많을수록 더 많은 시간을 투자해야합니다. 코드 난독 화는 암호화와 마찬가지로 코드를 깨는 데 필요한 시간을 늘리는 수단입니다. 따라서 코드가 난독 화되면 공격자는 숙련되고 시간을 할애해야합니다. 그렇지 않으면 절망하고 포기할 것입니다. 앱이 양쪽 끝에서 문제를 일으킬 가치가 있는지 스스로에게 물어봐야합니다.

난독 처리 된 코드를 해독하는 것이 얼마나 어려운지 실제로는 놀랍습니다. 난독 화를 통해 간단한 10 라인 C 프로그램을 100 라인 어셈블리로 쉽게 전환 할 수 있습니다. 디버깅을 시도하면 코드에서 무의미하게 뛰어 들며 실제로 단계별로 좌절 할 수 있습니다. 결국 그것은 깨질 것이지만 그것은 정말로 어려워지고 실제로 불가능한 것은 아무것도 없기 때문에 요점입니다. 코드 난독 화는 코드를 깰 수있는 사람의 수를 줄입니다.

크래커가 아닌 디버거를 혼동하려고하는 것과 같은 더 좋은 방법이 있지만 저렴하고 효율적인 방법입니다. 그러나 어색하게 이름을 짓는 것은 잘하지 않습니다. 실제로 전체 코드에는 아무런 영향을 미치지 않지만 크기와 복잡성을 증가시키는 제어 흐름 호출 함수를 변경해야합니다. 실제로 무언가를 수행하는 내부 함수에서 반환 값이 사용되지 않는 더미 함수를 호출하십시오. 이것이 실제로 어떻게 혼란 스러울 수 있는지 이미 알 수 있습니다.

공격자가 가지고 있지 않은 것이 있습니다. 원본 소스 코드 자신을 위해 더 잘 정리할 수있는 방법을 찾으십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.