문제

여기에 완벽한 문제의 예: 분류 보석 레일 휴식.

**원래 질문:**

중 하나 것에 대한 자세한 내용은 언제든 보안 전문가는 루비가 없는 병렬의 자바 패키지-개인정보.즉,이 유효하지 않습니다 루비:

public module Foo
  public module Bar
    # factory method for new Bar implementations
    def self.new(...)
      SimpleBarImplementation.new(...)
    end
    def baz
      raise NotImplementedError.new('Implementing Classes MUST redefine #baz')
    end
  end

  private class SimpleBarImplementation
    include Bar
    def baz
      ...
    end
  end
end

그것은 정말 좋은이 될 수 있을 방지하는 원숭이-패치의 Foo::BarImpl.는 방법으로,사람에 의존 라이브러리 알고있는 아무도 엉망이다.면 상상 누군가의 구현을 변경 또는 MD5SHA1 에 당신!수 freeze 에서 이러한 클래스를,그러나 나는 그것을 하는 클래스에서 클래스 단위로,그리고 다른 스크립트를 수정할 수 있는 그들을 마치기 전에 보안을 내는 경우 응용 프로그램에 나 주의에 대한 부하다.

Java 제공하는 많은 다른 도구를 위한 방어적인 프로그래밍,이는 많은 가능하지 않습니다.(보쉬 블로흐의 책에 대한 좋은 목록이다.) 이것이 정말로 관심이 있으십니까?해야 난 그냥 정지고 불평하고 루비 사용을 위한 가볍지에 대한 희망"엔터프라이즈"솔루션?

(그리고,핵심 클래스는 냉동하지 않은 기본적으로 루비에서.아래 참조:)

require 'md5'
# => true
MD5.frozen?
# => false
도움이 되었습니까?

해결책

Garry의 Immutable 확인돌리.

개별 방법의 재정의를 방지 할 수 있습니다.

다른 팁

문제가되지 않는다고 생각합니다.

예, 신화적인 "누군가"는 MD5 구현을 안전하지 않은 것으로 대체 할 수 있습니다. 그러나 그렇게하기 위해서는 신화적인 누군가가 실제로 루비 프로세스에 그의 코드를 가져올 수 있어야합니다. 그리고 그가 그렇게 할 수 있다면 아마도 그의 코드를 Java 프로세스에 삽입 할 수도있을 것입니다. MD5 작업에 대한 바이트 코드를 다시 작성하십시오. 또는 키 누르기를 가로 채고 실제로 암호화 코드를 조작하지 않아도됩니다.

일반적인 관심사 중 하나는 다음과 같이 사용되어야하는이 멋진 라이브러리를 작성하고 있습니다. 라코 디스

하지만 누군가 그렇게 사용하면 어떻게 되나요? 라코 디스

그리고 간단한 해결책은 : 그렇게하지 마세요! 보안에 중요한 응용 프로그램에서 모호한 소스에서 다운로드 한 신뢰할 수없는 코드를 실행하지 않도록 사용자를 교육하십시오. 그리고 만약 그렇다면 그들은 그럴 자격이있을 것입니다.

Java 예제로 돌아가서 : Java에서 암호화 코드를 privatefinal로 만들 수 있다는 것은 사실입니다. 그러나 누군가가 여전히 암호화 구현을 대체 할 수 있습니다! 실제로 누군가 실제로 그렇게했습니다. 많은 오픈 소스 Java 구현은 OpenSSL을 사용하여 암호화 루틴을 구현합니다. 그리고 아시다시피 데비안은 수년 동안 깨지고 안전하지 않은 OpenSSL 버전을 제공했습니다. 따라서 지난 몇 년 동안 데비안에서 실행 된 모든 Java 프로그램은 실제로 안전하지 않은 암호화로 실행 했습니다 !

<인용구>

자바는 방어 프로그래밍을위한 다양한 도구를 제공합니다.

처음에는 일반적인 방어 프로그래밍 에 대해 이야기하고 있다고 생각했습니다. 여기서 아이디어는 잘못된 데이터 입력으로부터 프로그램 (또는 프로그램의 하위 집합 또는 단일 기능)을 보호하는 것입니다.
그것은 대단한 일입니다. 저는 모든 사람들이 그 기사를 읽으라고 권합니다.

하지만 실제로는 "다른 프로그래머로부터 코드를 보호하는 것"에 대해 이야기하고있는 것 같습니다.

내 생각에 이것은 여러분이 무엇을하든 악의적 인 프로그래머가 항상 디버거에서 프로그램을 실행하거나 dll 주입 또는 기타 여러 기술

단순히 무능한 동료로부터 코드를 보호하려는 경우 이것은 말도 안됩니다. 동료를 교육하거나 더 나은 동료를 만드세요.

어쨌든 그런 일이 당신에게 큰 관심사라면 루비는 당신을위한 프로그래밍 언어가 아닙니다. 몽키 패칭은 의도적으로 거기에 있으며이를 허용하지 않는 것은 기능의 전체 요점에 위배됩니다.

루비에는 보안 문제보다 더 중요한 기능이 있습니다.덕 타이핑도 가능합니다.
예 :확장하거나 래핑하는 대신 Ruby String 클래스에 자체 메서드를 추가 할 수 있습니다.

"동료를 교육하거나 더 나은 동료를 구하십시오"는 소규모 소프트웨어 스타트 업에 적합하며 Google 및 Amazon과 같은 거대 기업에 적합합니다. 모든 낮은 개발자가 작은 도시의 의사 사무실에서 작은 의료 차트 응용 프로그램에 계약했다고 생각하는 것은 우스꽝 스럽습니다.

저는 우리가 가장 낮은 공통 분모를 위해 구축해야한다고 말하는 것이 아닙니다. 그러나 작업을 수행하는 라이브러리를 끌어들이는 평범한 프로그래머가 많이 있다는 사실을 현실적으로 생각해야합니다. , 보안에 신경 쓰지 않습니다. 보안에 어떻게주의를 기울일 수 있습니까 ? 아마도 알고리즘과 데이터 구조 수업을 들었을 것입니다. 아마도 그들은 컴파일러 수업을 들었을 것입니다. 그들은 거의 확실히 암호화 프로토콜 수업을 들지 않았습니다. 그들은 Schneier를 읽거나 소프트웨어를 만들 때 보안을 고려하기 위해 아주 좋은 프로그래머조차도 실질적으로 간청 해야하는 다른 사람들을 읽지 않았습니다.

걱정하지 않습니다. 라코 디스

저는 awesomefoobar가 필요한 fazbot, foobar가 필요한 has_gumption, 그리고 ... 결국 중요한 보안 측면을 취소하는 모호한 방식으로 이러한 충돌 중 두 가지가 충돌합니다.

한 가지 중요한 보안 원칙은 "심층 방어"입니다. 이러한 추가 보안 계층을 추가하면 실수로 발에 총을 쏘는 일을 방지 할 수 있습니다. 그들은 그것을 완전히 막을 수 없습니다. 아무것도 할 수 없습니다. 하지만 도움이됩니다.

원숭이 패칭이 마음에 든다면 Immutable 모듈 (또는 유사한 기능 중 하나)을 사용할 수 있습니다.

불변

Why the Lucky Stiff의 "Sandbox"프로젝트를 살펴볼 수 있습니다.이 프로젝트는 잠재적으로 안전하지 않은 코드 실행에 대해 걱정할 때 사용할 수 있습니다. http://code.whytheluckystiff.net/sandbox/

예 (온라인 TicTacToe) : http://www.elctech.com/blog / safely-exposing-your-app-to-a-ruby-sandbox

Raganwald에 최근 게시물 이 있습니다.이것에 대해서.결국 그는 다음을 구축합니다. 라코 디스

이는 fubar에 대한 공개 메서드로 Acronym를 노출하지만 내부 내장 (fubar)은 비공개로 유지하고 외부보기에서 도우미 모듈을 숨 깁니다.

누군가가 객체 나 모듈을 멍키 패치했다면 두 가지 경우를 살펴 봐야합니다. 그는 새로운 메소드를 추가했습니다.그가이 meyhod를 추가하는 유일한 사람이라면 (가능성이 매우 높음) 문제가 발생하지 않습니다.그가 유일한 사람이 아니라면, 두 방법이 똑같이 작동하는지 확인하고이 심각한 문제에 대해 라이브러리 개발자에게 알려야합니다.

방법을 변경하는 경우 방법이 변경된 이유를 조사해야합니다.일부 엣지 케이스 동작으로 인해 변경 했습니까? 아니면 실제로 버그를 수정 했습니까?특히 후자의 경우, 몽키 패치는 많은 곳에서 버그를 수정하기 때문에 신의 일입니다.

그 외에도 프로그래머가 이러한 자유를 건전한 방식으로 사용한다는 가정하에 매우 동적 인 언어를 사용하고 있습니다.이 가정을 제거하는 유일한 방법은 동적 언어를 사용하지 않는 것입니다.

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