>

어느 날 내 응용 프로그램이 모든 암호를 유효하지 않다고 선언했습니다.

지루한 검색 후에 문제가 발견되었습니다. 암호 초기화 벡터 (임의의 랜덤 비트)가 ENV를 통해 응용 프로그램에 제공됩니다. 그리고 레일즈는이 문자열 (임의의 이진 데이터)을 UTF-8로 변환하기로 결정했습니다.

서버 시작 전에 기본적으로이 작업을 수행하고 있습니다 :

ENV["RAILS_ACC_VEC"] = "\xB3n%-\x9E^\xE1\x93 \x17\xEER\x1B\n\x84S"
Rack::Server.start( ...

나중에

 if Rails.env != "production"
    salt = "dummy"
  else
    salt = ENV["RAILS_ACC_VEC"]
  end

비트 스트링의 길이는 128 비트 여야합니다. 그러나 길이는 176 비트이며 유효한 UTF-8을 포함했습니다. (분명히 암호 루틴은 완전히 실패했습니다.)

이 응용 프로그램은 현재 Rails 4.2.8 및 ruby ​​2.4에서 기본 인코딩으로 실행됩니다.

문제의 원인을 찾을 수 있습니다. 일반적으로 응용 프로그램은 서버에서 시작하거나 배포에서 시작하여 환경에 로캘이 없습니다. 이번에는 콘솔에서 시작되었으며 해당 콘솔은 ISO 8859로 설정되었습니다.

결과는 분명하다 : 어플리케이션이 항상 ENV의 명확한 로케일로 시작되도록주의해야한다- LC_CTYPE=C  (로케일이없는 것과 동일) 또는 UTF-8 (아마도 응용 프로그램에 기본 config.encoding 가있는 경우) ).

내가 지금 알아 내려고하는 것은 루비/레일이 언제, 왜 그런 일을 하는가? 트랜스 코딩은 IO 객체에서 발생할 수 있지만 열 때 의도 한 문자 세트를 지정할 수 있습니다.

시스템이 ISO 8859에서 실행되는 것처럼 보이고 레일 자체가 UTF-8로 실행되면 ENV가 외부에서 내부로 이동할 때 트랜스 코딩이 필요할 수 있습니다. 그러나 이는 언어와 관련된 경우에만 적용되며 모든 ENV 컨텐츠가 언어가 아닐 수도 있습니다.

ENV는 어떻게 바이너리 모드로 열리나요?

그럼 더 야망적인 질문은, 인코딩 기능으로 이런 종류의 악한 위험이 더 있는가?


  • 답변 # 1

    시스템 환경에 바이너리 데이터를 저장해서는 안됩니다. 운영 체제는 이진 데이터를 해당 환경에 저장하도록 설계되지 않았습니다. 나는 그 기능을 제공한다고 생각하지 않습니다. 모든 환경 변수는 텍스트 여야합니다. 아마도 OS가 환경에 이진 데이터를 저장할 수는 있지만 이것이 표준이라고는 생각하지 않습니다. 그들이 null 바이트를 저장할 수 있는지 의심합니다 ( \x00 ). 운영 체제의 보안 위험 일 수 있으며 환경을 읽는 다른 프로그램의 버퍼 오버플로 악용으로 이어질 수 있습니다. 'posix env binary'를 검색해보십시오.

    IV를 텍스트로 저장할 때마다 IV를 base64로 인코딩 된 데이터로 저장해야합니다.

    ENV['IV'] = 'VGhpcyBjYW4gYmUgYmluYXJ5Lg=='
    export IV=VGhpcyBjYW4gYmUgYmluYXJ5Lg== # or from the shell
    ...
    iv = Base64.decode64 ENV['IV']
    
    

  • 이전 machine learning - 컨벌루션 작업의 예기치 않은 결과
  • 다음 ruby on rails - Google Oauth2가 Google 도메인에서 실패