it-gundan.com

왜 OS가 "유닉스 시스템입니다!" 널리 구현되지 않았습니까?

제목에서 언급 된 Jurassic Park scene 은 기술에 능숙한 사람들에게 들리는 소리로 유명하지 않습니다. 그러나 공격자가 서버 또는 카메라 또는 베이비 모니터가 Linux를 실행하고 있음을 알게되면 웹 장치, 특히 IoT 장치에서 눈에 띄게 큰 구멍으로 보이는 것을 보여줍니다. 그들은 Sudo와 같은 명령이 육즙이 많은 목표라는 것을 알고 있으며 Shell 액세스가 lscat와 같은 유용한 도구를 가지고 있다는 것을 알고 있습니다.

왜 OS 난독 화가 더 많은 것이 아닌가? 웹 헤더에 버전을 숨기는 것에 대해 말하는 것이 아닙니다. JavaScript 축소 또는 난독 화와 마찬가지로 OS 자체에서 바이너리 및 파일 경로의 이름을 변경하는 것에 대해 이야기하고 있습니다. OS에 Sudols 대신 ha7TrUORRI6e29 명령이있는 경우 전체 공격 클래스가 실제로 쓸모 없습니까? 어떻게 든 원격 루트 액세스 권한을 얻은 해커를 상상해보십시오. 명령을 모르면 어떻게할까요?

컴파일러의 구현은 상당히 쉽습니다. "이 함수와 모든 호출의 이름을 바꾸십시오"라는 가장 간단한 경우를 생각해보십시오. OS 컴파일러와 응용 프로그램 컴파일러에 동일한 임의의 이름을 부여하면 서로 대화 할 수 있습니다. 그러나 응용 프로그램의 보안이 취약하고 bash 주입에 취약하더라도 이러한 공격은 효과가 없습니다.

분명히이 기법을 모든 시나리오에서 사용할 수있는 것은 아닙니다. 휴먼 시스템 관리자가 유지 관리하는 서버와 같은 시나리오를 제외하면 자동화로 관리되는 모든 장치 또는 서버가이 방어의 주요 후보 인 것 같습니다.

질문은 좀 더 구체적이어야한다고 생각합니다.

  1. 설명한대로 OS 난독 화가 널리 사용됩니까? 아니면 만난 적이 있습니까?
  2. 널리 사용하지 않으면 사용에 대한 실질적 또는 기술적 장벽은 무엇입니까?
156
Indigenuity

아이디어를 찢어 버리기 전에 정말 흥미로운 아이디어라고 생각하면 정말 재미있었습니다.

상자 밖에서 계속 생각하고 흥미로운 질문을하십시오!

알았어,하자!


한 걸음 물러서서 왜 베이비 모니터가 Linux를 처음으로 실행하는지 묻자. 운영 체제가없고 응용 프로그램이 마이크로 컨트롤러 코드 (arduino 코드라고 생각)로 작성된 경우 어떻게됩니까? 그러면 공격자가 사용할 Sudo 또는 ls 또는 셸이 없을 것입니다.

나는 여기 전문가가 아니지만, 우리는 산업계에서 개발자의 편의를 위해 Linux를 크게 실행할 수있는 모든 것에 Linux를 설치하는 데 중점을 두었다고 생각합니다.

  1. 개발 시간 단축 : Wi-Fi 및 블루투스 지원 웹 관리 클라우드 동기화 자체 패치 위스키 퍼를 동반자 Android 및 iOS 앱과 함께 빌드 할 때 Linux에는 모든 라이브러리, 유틸리티 및 드라이버를해야합니다.
  2. 테스트 가능성 향상 : SSH 포트를 사용하여 bash 또는 busybox를 실행하는 장치 인 경우 제품 테스트 단계에서 쉽게 연결하여 문제를 파악할 수 있습니다.

난독 화 아이디어가 작동하려면 Sudols와 같은 명령 줄 유틸리티 이름뿐만 아니라 모든 Linux 커널 API 를 난독 화해야합니다. 공격자가 커널을 직접 호출하는 컴파일 된 바이너리를 삭제하지 못하도록합니다. 아이디어를 다시 한 번 살펴 보겠습니다.

컴파일러의 구현은 상당히 쉽습니다. "이 함수와 모든 호출의 이름을 바꾸십시오"라는 가장 간단한 경우를 생각해보십시오. OS 컴파일러와 응용 프로그램 컴파일러에 동일한 임의의 이름을 부여하면 서로 대화 할 수 있습니다.

이 무작위 컴파일을 직접 수행해야합니다. 그렇지 않으면 누군가 Google에서 매핑을 찾을 수 있습니다.

따라서, 난독 화 된 커널 API의 매핑 만 알 수 있도록 "난독 화 컴파일러"를 사용하여 소스에서 커널을 빌드해야합니다. (소스에서 리눅스 커널을 구축 한 적이 있습니까? 개발 문화가 가고있는 방향 인 docker pull Alpine보다 더 많은 골칫거리입니다).

그러나 운영 체제는 단순한 커널 그 이상입니다. 미니 PC 장치에 제공되는 Broadcom BCM2837 와이파이 칩용 드라이버를 원하십니까? Broadcom에서 소스 코드를 제공 할 경우 컴파일러를 사용하여 잘못된 커널에 대해 해당 드라이버를 빌드해야합니다. 전체 GNU wifi 및 네트워킹 소프트웨어 스택을 빌드해야합니다. OS가 작동하기 전에 빌드 파이프 라인에 대한 소스를 찾고 추가해야하는 다른 항목은 몇 개입니까?

아, 그리고 그러한 것들의 업스트림 repos가 패치를 발행하면, 당신은 이제 그것을 다시 빌드 할 책임이 있습니다. (커널 바이너리와 일치하는 컴파일러 난독 화 매핑 파일을 저장했다고 가정) 설계 상으로 장치는 공급 업체에서 생산 한 패치 바이너리를 사용할 수 없기 때문에 장치에 배포됩니다.

아, 그리고 해커를 막으려면이 "Whizpopper 1.4.7 바이너리 파일이 있습니다"는 없습니다 ._ 아, 아니요. 커널은 기기 당 배송합니다.


그래서 당신의 질문에 :

  1. 설명한대로 OS 난독 화가 널리 사용됩니까? 아니면 만난 적이 있습니까?
  2. 널리 사용하지 않으면 사용에 대한 실질적 또는 기술적 장벽은 무엇입니까?

답은 말 그대로 소스에서 모든 것을 찾고 빌드해야 할 경우 기존 소프트웨어 구성 요소를 사용하는 목적을 거의 완전히 묘사하지 못한다는 것입니다. 실제로 운영 체제를 완전히 버리고 1960을 가장 한 척하고 응용 프로그램을 CPU 마이크로 코드로 직접 작성하는 노력이 덜 필요할 수 있습니다.

나는 대부분의 개발자보다 보안을 좋아하지만 f * that를 좋아합니다.

235
Mike Ounsworth

Mike의 답변은 기본적으로 이것이 개발 관점에서 왜 나쁜 생각인지에 대해 제공해야 할 모든 것을 말합니다 (Ghedipunk의 의견에서 알 수 있듯이 사용할 수없는 보안 기능은 보안을 제공하지 않습니다). 대신, 보안 관점에서 이유에 대해 이야기하겠습니다.

대답은 실제로 놀랍도록 간단합니다. 시간 낭비이며 엄밀히 더 나은 옵션이 있습니다. 모든 바보 같은 IoT doodad ( "IoT"의 "s"는 보안을 나타냄)는 사용자가 제안한 접근 방식을 따르지 않을 것 같은 그러한 기능을 구현하지 않아도됩니다.

  1. 전체 아이디어는 시스템 호출을 제한하는 데 효과가 없습니다. 공격자는 몇 개의 레지스터를 설정하고 opcode 및 붐을 호출 할 수 있습니다. 커널은 원하는 syscall을 실행합니다. 그 상징적 이름이 무엇인지 누가 신경 쓰나요? 물론, syscall 테이블을 조작하여이를 복잡하게 만들 수 있습니다 (모든 것을 다시 컴파일하고 사용자 정의 커널을 완전히 디버깅 할 필요가없는 경우). 사용중인 OS를 난독 처리하는 것과 같습니다. 어쨌든 후보자가 적을 때 왜 귀찮게합니까? 침입자가 시스템에서 기존 코드를 리버스 엔지니어링하고 싶지 않더라도 사용 가능한 통화 인덱스의 검색 공간이 내장 시스템에서 보았던 것보다 넓지 않으면 무차별 강제 실행이 가능해야합니다.
  2. 명령 이름을 완전히 액세스 할 수 없게 만들 때 왜 명령 이름을 난독 처리합니까? chroot은 Shell built-ins Shell을 실행하는 경우에서 작동하지 않지만 다른 모든 항목에서는 제대로 작동합니다. 응용 프로그램 상자에 쉘을 실행하고 있습니까? 내 말은, 개발 유닛은 테스트 목적으로 하나를 설치했을 것이고, 아마도 당신이 게 으르거나 다시 필요할 것이라고 생각하기 때문에 소매 이미지에서 제거되지 않을 것입니다. 그러나 공격자는 앱이 실행되는 컨텍스트에서 공격자를 실행할 수 없습니다. 간단한 chroot (또는보다 복잡한 샌드 박스/감옥/컨테이너)는 프로그램이 작업에 필요한 파일 이외의 파일을 실행할 수 없거나 심지어 액세스 할 수 없게합니다.
  3. 커널 API에 대한 액세스 권한을 제거 할 수 있는데 왜 커널 API를 난독 화합니까? 프로세스 (또는 그 하위 항목을 만들 수있는 경우)가 호출 할 수있는 것을 제한 할 수있는 수많은 샌드 박싱 시스템이 있습니다. https://stackoverflow.com/questions/2146059/limiting-syscall-access-for-a-linux-application 참조
88
CBHacking

lscat의 공격자를 박탈하는 것이 목적이라면 난독 화에 대한 더 나은 대안이 있습니다. 이러한 유틸리티를 설치하지 마십시오.

이것이 wide 구현 접근법이라고 말하지는 않지만 적어도 구현입니다. 예를 들어 도커 이미지 모음이 거의없는 distroless 를 고려하십시오. 그들 중 일부는 (가는 것과 같이) 문자 그대로 아무것도 없습니다. 이러한 컨테이너에서 실행되는 시스템에 대한 공격은 실행할 셸이 없기 때문에 셸 액세스 권한을 얻을 수 없습니다.

그런 다음 이러한 컨테이너에서 응용 프로그램을 공격하여 셸 액세스 권한을 얻는 유일한 방법은 컨테이너 런타임을 우회하는 것입니다.

도커 이미지의 예를 제시했지만 동일한 개념이 일반적으로 운영 체제에 적용될 수 있습니다. 예를 들어, lscat은 데비안에서 coreutils 패키지의 일부입니다. apt-get remove coreutils 및 공격자가 ls 또는 cat을 (를) 공격의 일부로 사용할 수 없다고 확신합니다. 물론 이것은 당신도 그것들을 사용할 수 없다는 것을 의미하며, 아마도 제거해야 할 coreutils에 의존하는 다른 많은 것들이 있지만 내장 장치 또는 한 가지만 수행하는 서버의 경우 괜찮을 수도 있습니다.

일반적인 원칙은 "공격 표면"을 줄이는 것입니다. 대상이 가진 "물건"이 많을수록 타협하기 쉽습니다. 오픈 네트워크 포트, 코드 라인 또는 바이너리가 설치되어있을 수 있습니다. 보안을 강화하는 것이 목표라면, 불필요한 "물건"을 모두 제거하는 것이 좋습니다.

30
Phil Frost

난독 화는 보안이 아니고 OS 난독 화는 기본적으로 말도 안되기 때문입니다.

일반적인 OS는 너무 많고 교육받은 추측을하는 많은 방법이 있습니다. 내가 IIS 또는 MSSQL Server)를 실행하고 있음을 감지하면 어떤 OS가 실행되고 있는지 추측 할 수 있습니다.

어떻게 든 내 기본 OS에 대해 아무것도 알려주지 않는 스택을 실행하고 그것에 대한 다른 모든 힌트를 가리지 만 (지문은 중요합니다), 나는 여전히 많이 이기지 못했습니다.

보안 측면에서, 나는 리눅스를 사용하고 있거나 심지어 데비안 8을 사용하고 있다는 것을 알고 있지만, 당신이 일하거나 걱정할 필요가 없습니다. 내가 제대로 강화되고 패치되면 원하는 것을 알 수 있습니다. 어제 소프트웨어 박물관에 적용한 패치 수준에 도달 한 경우, 공격이 모두 시도되어 간단하게 공격 할 수 있으며 OS를 난독 처리하면 쓸모없는 몇 가지 공격을 더 시도해야합니다. 자동 공격에서는 몇 초의 속도가 느려집니다.

난독 화가 작동하지 않습니다. 사람들은 당신을 스캔하거나 지문을 남기거나 전체 악용 라이브러리를 던져 무엇이 작동하는지 확인할 수 있습니다.

실제 강화에 소비 할 수있는 시간을 낭비하면 실제로 보안에 해가됩니다.

적절한 경화 작업. 나는 그 위에 "당신이 원하는 것을 알 수 있습니다". 연설을 한 보안 회의에서 내 IP 주소와 root password를 게시했습니다. 원격 루트 로그인 및 많은 서비스가 활성화 된 SSH. SELinux 머신을 심각하게 강화했습니다. 내 정책이 아직 완벽하지 않을 때 한 사람이 루트 디렉토리에 텍스트 파일을 놓은 적이 있었지만 아무도 내 연설을 방해하지 못했습니다.


부록 : 시작점은 영화였습니다. 난독 화는 그와 같은 계시가 관객들에게 영웅 (또는 악당)이 정보를 발견하여 진보하고 있다는 것을 알려주기 때문에 훌륭한 영화 장치입니다. 코드가 여전히 필요하더라도 금고의 위치를 ​​찾는 것과 동등한 컴퓨터입니다. 그것이 올바른 감정 메시지를 청중에게 전달한다면 그것이 사실인지는 중요하지 않습니다.

13
Tom

매우 널리 퍼져있는 예를 들어, 자체 OS가있는 Intel Management Engine은 펌웨어 업데이트 메커니즘이 있지만 펌웨어의 세부 사항이 기밀 인 매우 특정한 형식이어야합니다. 알 수없는 매개 변수로 허프만 인코딩이 포함 된 것으로 보입니다. 귀하의 제안 (기본적으로 펌웨어의 대칭 암호화)과 마찬가지로 ME는 펌웨어 준비시 특정 수정이 필요하며 실행시 표준 메커니즘과 일치하는 편차가 있습니다.

7
Roman Odaisky

설명하는 것을 "불안을 통한 보안"이라고하며 널리 알려진 보안 반 패턴 입니다. 안보 철학에 입문하지 않은 사람들은 교육에 빠지지 않도록 교육해야한다는 것이 새로운 아이디어가 아니라 오래되고 나쁜 아이디어라는 것을 의미합니다.

안전을 위해 집을 설계하고 있으며 모호함이 유망한 전략이라고 생각했다고 상상해보십시오. 모든 집은 복도와 방, 문 손잡이가있는 문, 전등 스위치 등으로 구성됩니다. 이들은 일반적으로 알려져 있기 때문에 침입자가 일반적으로 알려진 구성 요소로 집을 쉽게 탐색 할 수 있기 때문에 이것이 안전하지 않은 이유 일 수 있습니다. 건축 원칙을 처음부터 다시 설계하고 문 손잡이를 루빅스 큐브로 교체하고 천장 높이를 반으로하여 침입자를 혼동시킬 수 있습니다. 그것과 관련이 있으며, 최악의 상황은 침입자가 일단 안으로 들어가면 눈으로 둘러보고 뇌를 사용하여 알아낼 수 있기 때문입니다. 해커는 퍼즐 중독자입니다.

집을 보호하는 솔루션은 비표준 건축을하는 것이 아니라 자물쇠, 창문, 보안 시스템 등을 개선하는 것입니다. 결국 비밀 통로에 금을 숨기고 싶지 않습니다. Costello는 그 촛대에 기대어 실수로 엽니 다. 좋은 비밀 조합과 탬퍼 알람으로 금을 금고에 넣으십시오. 컴퓨터 동등 물은 공개 키 암호화, 제한된 사용자 액세스 역할, 모니터링 시스템, 노출 된 노출 영역 감소, 진입 위협 벡터 완화 등에 의한 자격 증명 액세스가 제한되어 있습니다.

컴퓨터 시스템을보다 모호하게 만들려는 노력은 시스템을 지원에서 멀어지게하고, security 패치를 얻기 어렵고, 안전한 방법으로 사용하기 어렵게합니다 .

편집 : 때때로, 일부 통해 보안 실제 보안 이외에도 모호함이 허용됩니다. 일반적인 예는 30000과 같은 높은 포트에서 SSH를 실행하는 것입니다. SSH는 암호화되어 있으며 액세스는 자격 증명 인증 뒤에 있습니다. 이것이 바로 실제 보안입니다. 그러나 높은 포트에 연결하면 누군가가 빠른 스캔을 수행하는 경우 시작하기가 쉽지 않습니다. OS를 난독 화하려는 것과 같이 이것보다 더 복잡해진 것은 운영상의 악몽이 될 수 있으며 실제 패치 (예 : 패치에 대한 최신 정보)를 어렵게 만듭니다.

5
user1169420

생각 useability

  • 새 sysadmin에게 ha7TrUOSudo, RRI6e29 대신 ls예, 배우기 만하면되는 번역 목록이 있습니다 !
  • 로컬 네트워크 탐색 가능하지 않아야합니다 : 전체적인 견해를 유지하려면 종이 목록을 유지해야합니다!?

  • 모든 중요 명령의 이름을 바꾸면 시스템 업그레이드를 위해이를 구동해야합니다!

  • Nick2253 comment out 으로 임베디드 시스템을 구축하려고하면 최종 제품을 게시하기 전에 난독 처리를 수행하면 최종 제품을 테스트해야합니다.

    • 난독 처리를 위해 모든 것을 바인딩하려면 home made 스크립트를 만들어야합니다.
    • 무언가 잘못되면 디버깅이 까다로워집니다.
    • 디버깅을 수행하려면 home made 난독 화 스크립트를 만들어야합니다.
    • 사용자 정의 피드백 (로그 파일 포함)은 비난 독 처리되었습니다이어야합니다.

    그렇게하면 새로운 잠재적 버그로 중요한 작업을 추가 할 수 있습니다.

    보안 개선이 거의없는 경우 추가 참조

불확실성 은 자신을 해칠 수 있습니다.

생각 낮은 레벨

  • 파일의 이름을 바꾸려고 시도하더라도 응용 프로그램 및 운영 체제 수준에서 작동하면이 모든 것이 standard library 공격자가 이진 실행 파일을 보내면 직접 호출됩니다. 모든 표준 라이브러리를 난독 처리하는 것도 고려할 수 있습니다! (파일 시스템, 네트워크 프로토콜 포함 ...)

  • 수정되지 않은 커널을 사용하는 동안 standard 변수와 네임 스페이스를 사용합니다. 따라서 커널의 난독 화 버전을 만들어야합니다 ...

... 그런 다음 모든 것을 하나로 묶으십시오!

글쎄, 모든 것이 혼란 스러울 때에도 응용 프로그램은 인터넷을 처리해야합니다. 난독 화는 이것에 대한 개념적인 버그로부터 막을 수 없습니다!

Obscurity 모든 수준이 아닌 경우 보안을 향상시키지 않습니다.

완전한 모호함 인터넷을 처리하기 위해 표준 프로토콜을 사용해야하므로 실제로는 불가능합니다.

생각 라이센스

distributeGNU/Linux 로 계획하려는 경우 GNU GENERAL PUBLIC LICENSE GPLv 및/또는-에 설명 된대로 소스 코드를 공유해야합니다. GNU LESSER GENERAL PUBLIC LICENSE LGPLv (사용 된 응용 프로그램 및 라이브러리에 따라 다름) 이것은 모든 distributed 제품과 함께 난독 화 방법의 게시를 암시합니다.

두 가지 질문에 엄격하게 대답하십시오.

나는 전문가이지만 매우 작은 초점입니다. 여러 다른 소규모 비즈니스 인프라에서 작업하면서 몇 년 전에 몇 가지 선택을했습니다. 진화와 역사는 나의 선택을 확인하는 것처럼 보이지만, 그것은 나의 개인적인 관점 일뿐입니다.

설명한대로 OS 난독 화가 널리 사용됩니까? 아니면 만난 적이 있습니까?

따라서 나는 실제로 난독 화 비율이 widely 사용된다는 것을 알지 못하지만 security by unscurity = 및하지 말도록 명령하십시오.

널리 사용하지 않으면 사용에 대한 실질적 또는 기술적 장벽은 무엇입니까?

장벽이 없습니다! 단지 비생산적입니다. 시간 비용이 빠르게 증가하고 보안 개선이 필요합니다.

물론 몇 가지 최소한의 작업을 수행해야합니다.

  • 필요하지 않은 경우 ssh 서버를 시작하지 마십시오
  • Sudo를 설치하지 말고 올바른 permissions, groups 및 일관된 구조를 사용하십시오.
  • 글로벌 인프라를 최신 상태로 유지하십시오 !!!

작은 샘플 when light come over obscurity

  • ssh 보안 : 양방향.

    • SSH 포트를 22에서 34567로 이동

      • 가볍고 빨리 끝나지만

      공격자가 발견 한 경우 최종 사용자가 발견 할 때까지이 포트에 대해 강력한 무차별 대입을 가할 수 있습니다.

    • 방화벽 설치

      • 더 강하고 더 많은 지식이 필요합니다.

      최신 상태에서 더욱 안전합니다.

4
F. Hauri

OS에 Sudo 및 ls 대신 ha7TrUO 및 RRI6e29 명령이있는 경우 전체 공격 클래스가 실제로 쓸모 없습니까? 어떻게 든 원격 루트 액세스 권한을 얻은 해커를 상상해보십시오. 명령을 모르면 어떻게할까요?

더 좋은 대안은 이러한 명령을 처음에 설치하지 않는 것입니다. 나는 당신이 실제로 need 리눅스 커널을 실행하기위한 쉘이라고 믿지 않는다.

그러나 다른 사람들이 지적했듯이, 이는 보안과 개발 용이성 사이의 균형입니다. 불행히도 많은 장치 제조업체는 전자보다 후자에 대해 더 많은 관심을 기울입니다.

컴파일러의 구현은 상당히 쉽습니다. "이 함수와 모든 호출의 이름을 바꾸십시오"라는 가장 간단한 경우를 생각해보십시오. OS 컴파일러와 응용 프로그램 컴파일러에 동일한 임의의 이름을 부여하면 서로 대화 할 수 있습니다. 그러나 응용 프로그램의 보안이 취약하고 bash 주입에 취약하더라도 이러한 공격은 효과가 없습니다.

컴파일러 도움이 전혀 필요하지 않습니다. 모든 심볼 이름에 무작위를 적용하도록 linker ¹를 수정하여 대부분이 작업을 수행 할 수 있다고 생각합니다. 아마도 제조업체에게만 알려진 소금으로 해시 함수를 적용하는 것만으로도 충분할 것입니다. 이 작업을 수행하기 위해 소스 코드가 필요한지도 확실하지 않습니다. 즉, I think 맨 글링을 이미 컴파일 된 코드에 적용 할 수 있습니다.

(¹ 이것은 거짓말이라고 생각합니다. 심볼 이름을 바꾸려면 객체 코드를 수정해야 할 수도 있지만 이것은 여전히 ​​어셈블러 수준과 비슷합니다. a) C/C++ 등을 컴파일하는 hard 비트 코드와 b) C/C++/무엇이든 소스 코드가 필요하지 않습니다. OTOH 장치 코드가 Python과 비슷한 경우 이런 종류의 작업을 전혀 수행 할 수 있는지 확실하지 않습니다.)

공정을 역 엔지니어링 할 가능성이 여전히 있지만, 소금을주지 않으면 GPL² (특히 GPLv3)에 위배 될 수 있습니다.

사실, "GPL로 인해"는 아마도 이것이 보이지 않는 주된 이유 일 것입니다. 각 장치를 different로 만드는 것 외에 실제로 유용한 방식으로 구현하기는 어렵습니다. OTOH는 최소한 공격자가 "any Linux x.y.z를 실행하는 장치"의 취약점을 악용 할 수있는 것이 아니라 특정 장치 만 대상으로 삼을 수 있음을 의미합니다.

(² 간단하게하기 위해, 나는 전체적으로 "GPL"을 사용할 것입니다. 그러나 이것은 일반적으로 L GPL에 적용됩니다.)

즉, GPL은 소스를 "수정"했기 때문에 소금을 게시 할 필요가 없습니다. 컴파일시 심볼 이름 임의 화가 발생하면 have n't 소스를 수정 한 것입니다. 솔트를 게시해야하는 이유는 GPL에서 사용자가 GPL 라이브러리의 자신의 버전을 대체 할 수 있어야하기 때문입니다. 언급 한 바와 같이, GPLv2를 사용하여이 기능을 제거 할 수 있지만 기술적 인 효과는 GPLv3가 특별히 해결하기 위해 작성된 "서명 된 소프트웨어 만 실행"과 유사합니다.


궁극적으로 여기에는 일부 장점이있을 수 있지만 특별한 시스템을 더 안전하게 만들지는 않습니다 (일반적으로 "모호함을 통한 보안"은 보안). 당신이 can 달성하는 것은 단일 벡터를 통해 많은 시스템을 목표로하는 것을 어렵게 만드는 것입니다.

4
Matthew

공정 공개 : 저는 이것을 구축하는 회사의 CTO입니다. 당신이 원하는 모든 것을위한 편견.

실제로 IS 시스템 커널, 장치 드라이버, 패키지, 전체 스택 PER 호스트를 하루에 여러 번 완벽하게 구축 할 수 있으며 매우 효과적 일 수 있습니다. Google이 유일한 것은 아닙니다. 적어도 Google은 모든 머신에서도이 작업을 수행한다고 추론 할 수 있습니다 (참조 예정).

이제 머신 단위로 처음부터 다시 빌드 할 수있는 기능이 있다면 변경할 수있는 것은 무엇입니까?

커널 자체 보호 프로젝트는 커널 구조의 무작위 순서 변경을 통해 이미이를 허용합니다 : https://lwn.net/Articles/722293/ . 이 기사는 또한 Linus Torvalds가 보안 극장이라고 부르는 유명한 교류를 언급하지만 프로젝트 작성자 (Google에서 일하는 사람)는 "글쎄, Facebook 및 Google은 커널 빌드를 공개하지 않습니다"라고 말합니다.

이것은 적어도 구글이 이것을하고 유용하다고 생각하는 추론으로 이어진다. 닫힌 세트에 대해 더 많은 유형의 스크램블링을 할 수 있습니까? 가장 기본적인 수준에서 Windows 바이러스가 Linux 또는 Mac에서 실행되지 않는 이유는 무엇입니까? 형식이 다르기 때문입니다. 아래의 모든 x86이지만 동일하지는 않습니다. 두 리눅스가 비슷한 방식으로 다르다면 어떨까요? Windows 대 Linux는 "난독 화"가 아닙니다. Windows와 Linux를 다른 Linux로 만드는 방법이 많지 않기 때문입니다. 그러나 그것은 불가능하지 않으며 실제로 그렇게 어렵지는 않습니다. KSPP의 접근 방식을 사용하여 syscall에 적용한 다음 해당 syscall에 대해 모든 것을 다시 컴파일하십시오. 그것은 적어도 플라이 비 방식으로는 아니기 때문에 깨지기 어려울 것입니다.

귀하의 질문은 심볼 이름 바꾸기 (실행 파일 이름, 라이브러리 등)에 관한 것입니다. 이것은 두 가지 측면이 있습니다. (a) 유용합니까? (ᄂ) 확실하게 할 수 있습니까?

우리는 PHP 코드 인젝션을 한 번에 해결하는 방법을 찾고있었습니다. 무엇에도 불구하고 HackerNews는 당신을 믿게 할 것입니다 , PHP 코드 삽입은 인터넷 메시지 보드 외부에서 해결 된 문제가 아니며 실제 PHP 개발자, 관리자 및 사용자는 지속적으로 많은 코드 주입에 노출됩니다.

그래서 우리는 Polyscripting (허용 된 MIT 라이센스 오픈 소스)을 시도하기 시작했습니다 : https://github.com/polyverse/polyscripted-php

피드백을 요청하기 위해이 정보를 공개적으로 공유하고 polyscripted.comnonpolyscripted.com 의 두 웹 사이트를 운영하는데,이 웹 사이트는 이름에 따라 정확히 원하는 것을 수행합니다. 우리는 펜 테스터를 고용하여 파산을 시도했습니다.

그리고 방금 실행 가능한 공유 라이브러리 및 닫힌 세트의 이름을 내 보낸 심볼 (예 : 도커 컨테이너)을 실험하기 시작했습니다. 나는 개인적으로 이것이 더 많은 가치를 추가한다고 생각하지 않지만 조금 더할 것입니까? 나도 그렇게 생각해. 따라서 비용이 절감됩니다. 더 적은 비용으로 적은 가치를 얻을 수 있다면 왜 그렇게하지 않습니까? 이것이 바로 우리 모두가 ASLR을 보유한 이유입니다. 얇게 썬 빵 이후 최고의 방어력은 아니지만 이미 재배치 가능한 코드가 있고 어쨌든 코드를 다시 주문할 경우 제한에 도달하지 않고 무작위 화하는 이유는 무엇입니까?

요컨대, 움직이는 표적 방어 분야의 많은 학자들과 함께 많은 사람들 (Google, Facebook, Linux 커널 등)과 많은 사람들이 설명하는 접근 방식을 시도하고 있습니다. ASLR처럼 사소한 소모품을 만들려고 노력합니다.

2
Archis Gore

나는 이것을 해커의 관점에서 어떻게 볼 수 있는지 말할 것이다.

확실히, 모든 유틸리티의 이름을 바꾸면 훨씬 힘들고 편안해 지겠지만 어떻게해야합니까?

  1. 시스템의 셸에 이미 액세스 권한이 있으면 busybox (모든 바이너리는 하나의 바이너리로 구성) 또는 바이너리는 기본 작업에 필요한 전체 바이너리 세트 만 업로드하면됩니다.

  2. 권한을 더 높이려면 suid-root 바이너리를 찾아야 할 수 있으며 그중 몇 가지 (Sudo, mount 등)가 있습니다. 해커는 이미 루트가 아닌 한 해당 파일을 업로드 할 수 없습니다. 간단한 소형 리눅스 시스템에는 24 개의 suid 바이너리가 있습니다. 각각 수동으로 시도하는 것이 매우 쉽습니다.

그러나 어쨌든, 나는 이것이이 박스를 해킹하는 것을 더 어렵게 만들 것이라는 데 동의한다. 이 시스템을 사용하는 것은 힘들지만 가능합니다. 그리고 해커는 시간 또는 일 또는 월 동안 시스템에서 작업하지만 관리자/사용자는 몇 년 동안 시스템에서 작업 할 수 있으며 ha7TrUO 및 RRI6e29 이름을 기억할 수 없습니다. 아무도 아무도 시스템을 해킹하려고 시도하지 않을 수도 있지만 관리자는 매일 어려움을 겪을 것입니다.

그러나 ... 보안을 너무 높이지만 사용자/관리자에게는 불편한 경우 종종 보안 수준을 낮추는 경우가 많습니다. 20 개 이상의 문자로 복잡한 암호를 적용하는 경우와 마찬가지로 대부분 암호는 모니터의 포스트잇 메모에 기록됩니다. 시스템을 혼란스럽게 만들면 훌륭한 사용자를 위해 시스템을 작동시키기가 매우 어려울 것입니다. 그리고 삶을 편하게하기 위해 몇 가지 일을해야합니다. 예를 들어 통화 중 바이너리를 업로드 할 수 있습니다. 임시. 그리고 그들은 나중에 잊어 버리려고 계획하기 때문에 그것을 잊어 버리거나 의도적으로 남겨 둘 것입니다.

1
yaroslaff

Ssh 연결이 암호화되어 있기 때문에 실제로 발생합니다. 일부 핵심 바이너리의 이름을 변경해도이 이상을 달성 할 수 없습니다. 또한 그것은 많은 혼란을 일으킬 것입니다 : 예 : 이러한 유틸리티에 의존하는 스크립트는 사용할 수 없게되거나 일종의 프록시 "deobfuscator"가 있어야합니다. 그러나 루트 로그인을 허용하지 않는 Sudo를 강제로 사용하는 일부 서버를 보았습니다. sudoers의 사용자 이름은 다소 비밀로 유지됩니다. 그것이 얼마나 안전한지 잘 모르겠지만 전문가는 아닙니다.

0
galaktycznyseba

모든 문에 10 개의 열쇠 구멍이없는 이유는 무엇입니까? 답 : 대부분 귀찮은 사람은 도둑 시간의 10 초를 더 가치가 없습니다.

수백만 개의 고유 한독립적으로 생성 된 소스 코드 운영 체제가 있다면, 모호한 것이 일반적 일 수 있습니다. 실제적으로, 우리는 대략 4 가지의 고유 한 코드 기반을 가지고 있습니다.-이벤트 타이밍에 의한 모든 정보 유출 및 칩 제조업체가 특정 CPU 기능을 활성화 또는 액세스하기 위해 규정 된 기계 비트 코드 시퀀스를 제공하는 여러 저수준 OS 기능에 대해 모두 정확히 동일한 코드를 포함하는 짧은 시퀀스를 가지고있을 것입니다.

0
Dusty