분류 Nodejs

Sequelize ORM npm 라이브러리가 SQL 주입 공격에 취약한 것으로 밝혀 짐

컨텐츠 정보

  • 조회 787 (작성일 )

본문

일반적으로 ORM이라고도 하는 개체 관계형 매퍼 (Object-Relational Mapper)는 개발자가 데이터베이스 구조를 언어 구성으로 추상화 하여 데이터베이스 코드를 관리 할 수 ​​있도록 도와주는 SQL 라이브러리 세트입니다.


SQL ORM 라이브러리는 SQL 인젝션 방지에 유용하지만 불행히도 자체적으로 애플리케이션 레벨 SQL 인젝션 공격의 문을 여는 보안 버그가 있을 수 있습니다.


https://snyk.io/blog/sequelize-orm-npm-library-found-vulnerable-to-sql-injection-attacks/ 


SQL 인젝션 공격에 관심을 가져야 하는 이유는 무엇입니까? 


ORM 사용의 주요 이점은 SQL 주입 취약점을 방지하기 위해 입력을 피하는 기술인 준비된 명령문을 사용한다는 것입니다. 그러나 OWASP Top 10에 따라 주입 공격이 최상위 목록에 올랐으며 Akamai의 인터넷 보고서에 따르면 SQL 주입 취약점은 모든 웹 응용 프로그램 공격의 거의 3 분의 2 (65.1 %)를 차지합니다.


우리는 과거에 SQL 인젝션 및 ORM에 대해 자세히 설명했습니다. 주제에 대해 더 자세히 읽으려면 Snyk 팀이 인기 있는 npm 라이브러리에서 발견 한 최근 SQL 인젝션 예제에 중점을두고 싶습니다. 후유증.


Snyk, npm Sequelize ORM 라이브러리에서 SQL 주입 발견 


2019 년 6 월 Snyk는 Node.js 응용 프로그램에 널리 사용되는 npm 라이브러리 인 Sequelize를 사용하는 응용 프로그램에 대한 SQL 주입 공격을 유발할 수 있는 공격 경로를 발견했습니다. 전체적으로 CVE CVE-2019-10752 CVE-2019-10749, CVE-2019-10748로 식별 된 Sequelize에 영향을 주는 세 가지 SQL 주입 취약점이 발견되었습니다.


곧 Jan Aagaard Meier 및 Sushant Dhiman 시퀀서 관리자와 문제를 확인한 후 발견 한 내용을 책임감 있게 공개하고 보안 취약점과 이로 인한 취약한 코드 경로를 보여주는 SQL 삽입 예제를 제공했습니다.


보안에 대한 Sequelize의 약속을 증명하고 가능한 한 빨리 사용자를 보호하는 동시에 라이브러리의 3.x 및 5.x 분기에서 수정 사항을 신속하게 대응 및 릴리스하여 취약점을 개선하고 SQL 주입을 위한 업그레이드 경로를 사용자에게 제공했습니다. 예방.


sql injection vulnerability fixed by kirill and snyk security research team 


Sequelize 프로젝트는 PostgreSQL에 영향을 미치는 보안 취약점과 MySQL 및 MariaDB 방언의 보안 취약점을 수정 한 5.8.11을 해결하는 버전 3.35.1의 수정 사항을 릴리스했습니다. 안전한 버전의 sequelize를 사용하려면 가능한 빨리 업그레이드하는 것이 좋습니다.


언급 된 세 가지 중 가장 최근의 SQL 주입 취약점은 Sequelize 버전 5.15.1에서 수정되었으며 공식 릴리스 노트에 아래와 같은 예가 포함되어 있습니다.


Screen-Shot-2019-08-21-at-14.45.35.png 


MySQL 및 MariaDB에 대한 SQL 주입 예제 


5.8.11보다 낮은 모든 버전의 sequelize에는 MySQL 및 MariaDB 방언에 대해 올바르게 이스케이프 되지 않는 JSON 경로 키가 포함되어 있으므로 SQL 주입 (CVE-2019-10748)에 취약합니다.


sequelize를 사용한 다음 SQL 주입 예제를 고려하십시오.


class Project extends Sequelize.Model {}

Project.init({
  name: Sequelize.STRING,
  meta: Sequelize.JSON,
}, {
  sequelize,
  tableName: 'projects',
});

(async () => {
  await sequelize.sync();

  console.log(await Project.findAll({
    where: {meta: {"a')) AS DECIMAL) = 1 UNION SELECT VERSION(); -- ": 1}},
    attributes: ['name'],
    raw: true,
  }));
})();

메타 데이터 데이터베이스 필드에는 JSON 객체가 필요하지만 제공된 키는 작은 따옴표를 이스케이프 처리하도록 제대로 삭제되지 않았습니다. 작은 따옴표가 쿼리에 필요한)) AS DECIMAL) 텍스트와 함께 전달되면 코드를 악용 할 수 있습니다.


여기서 SQL 주입 예제는 UNION과 같은 SQL 쿼리를 추가로 실행하거나 세미콜론으로 쿼리를 완전히 종료하고;와 같은 접미사를 추가하는 방법을 보여줍니다. 드롭 테이블 사용자.


유사한 SQL 인젝션 취약점은 PostgreSQL 언어에 대해 3.35.1 미만의 모든 버전에 영향을 줍니다.


영향을 받았으며 어떻게 해야 합니까? 


Snyk에서 프로젝트를 모니터링하고 취약한 버전의 후유증을 발견하면 Snyk의 일상적인 경고를 통해 알림을 받습니다. 또한 GitHub 리포지토리를 연결하면 시퀀셜을 고정 버전으로 업그레이드 하기 위한 풀 요청이 자동으로 생성됩니다.


Snyk 보안 연구 팀은 지속적으로 많은 언어 생태계의 보안 취약점을 발견하는 일에 참여하고, 몇 가지 예는 여러 언어 생태계와 애플리케이션에 영향을 미치는 수천에 걸쳐 우편 슬립 취약점을 산출 최근 lodash의 NPM 라이브러리 보안 취약점 뿐만 아니라 광범위한 연구하다 .


Snyk에서 프로젝트를 모니터링 하지 않고 이 패키지의 사용에 대해 프로젝트를 테스트하려는 경우 아래에서 또는 CLI를 사용하여 로컬로 프로젝트를 테스트 할 수 있습니다.


또한 안전한 코딩 규칙을 연습하고 SQL 주입 치트 시트에 대한 OWASP의 모범 사례와 같은 모범 사례를 따르는 것이 좋습니다.