Flaws, faults, failures
- Flaws : 프로그램 상 문제
- security flaw : confidentiality, integrity, availability 등 security에 문제를 줄 수 있는 문제
- Faults : 잠재적인 문제 - programmer / specifier / inside view
- Failures : 문제가 발생함 - user / outside view
faults를 고치는 법
- 일단 faults를 찾기
- 고의로 failures 발생시킴 ( attacker 처럼 생각하라!)
- pentrate & patch- faults를 찾으면 고친다
- 마이크로소프트의 patch tuesday가 잘 알려진 예시
- 패치한다고 다 좋은 게 아니다
- 좁은 focus로 failure를 잡아내면 다른 더 큰 문제가 발생할 수 있다. 부분적인 fix가 다른 것들과의 불일치를 낳고 문제를 만든다.
- 즉 하나의 fault패치가 또다른 fault를 낳는다
Unexpected behavior
- 프로그램의 동작이 지정될 때, 일반적으로 프로그램이 해야 할 일을 나열한다.
- ls command - user가 해당 디렉터리를 읽을 권한이 있다면 디렉터리 안 파일의 이름을 list한다.
- 대부분의 사람들은 그 리스트에 무언가 추가되어있어도(추가 동작이 실행되어도) 신경쓰지 않을 것이다 - 그런데 이것을security / privacy관점에서 보면 추가 동작은 나쁘다!
- 파일 이름을 표시한다 → 공공 웹사이트에 게시한다?
- 파일 이름을 표시한다 → 그 파일을 삭제한다?
Types of security flaws
- inentional flaws
- malicious(악의적인) flaws - 어택 시스템에 삽입된다
- 그것이 어떤 특정 시스템에 어택을 가하기 위한 것이라면 우리는 그것을 targeted malicious flaw라고 한다.
- Nonmalicious(악의적이지 않은, 그러나 의도적인) flaws - 어떤 목적을 위해 시스템에 일부러 삽입한 것이지만, attacker가 사용해 failure를 일으킬 수 있다.
- unintentional flaws
- 대부분의 security flaw는 의도치않은 프로그램 에러에서부터 나온다.
- 아래 buffer overflows, Integer overflows, format string vulnerabilities, Incomplete mediation, TOCTTOU error 등은 unintentional flaws이다.
unintentional flaws
buffer overflows
- 입력 데이터에 대한 버퍼사이즈를 체크하지 않는다면? - 여기에서 벗어나는 것들이 프로그램을 망가뜨림
smashing the stack for fun
- 배열의 끝보다 길게 씀으로써 실행 스택을 때려부술 수 있다..
- buffer overflow가 어떻게 작동하는지 보여주는 사례가 된다.
- upshot : attacker가 stack의 배열 끝을 지나 데이터를 쓸 수 있는 경우, 저장된 return address를 덮어쓸 수 있음. function이 return되면 아무 address로도 jump할 수 있음
- Targets : setuid를 실행하는 로컬머신의 프로그램 또는 머신을 조작하는 network daemons
- buffer overflow의 종류 - 악으앙ㄱ강ㄱ 데이터구조좀 열심히 할걸 으악악악윽악
- single byte를 쓸 수 있다면 작동하는 attack
- stack 대신에 heap구조로 버퍼 오버플로우
- 쉘코드 대신에 프로그램, 라이브러리의 다른 파트로 점프
buffer overflows에 대응하는 법
- bound checking하는 language 사용 - catce exception
- non-executable stack
- 각 프로세스마다 랜덤 어드레스 스택
- 각 function을 return하기 전에 탐지 - “Canaries”
Integer overflows
- 정수(int)의 값이 커져서 허용된 공간보다 커짐. 실제 저장 값이 아주 작은 수거나 음수가 되어 프로그램이 오류나는 vunerability
- machine integer는 제한된 숫자 set만 나타낼 수 있다.
- 프로그램은 integer가 항상 양수라고 가정하는데, overflow가 일어나면 integer가 음수로 바뀌고, 가정을 위반하게 된다. + mathmatical operation causes overflow
- attacker는 프로그램에 값을 전달하고 그것이 overflow의 trigger가 된다.
- 그래서 데이터 타입이 중요하다고 했던거다.. 파이썬의 max number는 sys.maxint()등으로 알 수 있다.. 확인하는 버릇을 들이자
format string vulnerabilities
- class of vulnerabilities는 2000년에 발견되었다.
- (in c) printf(”%s%s%s%s”)는 프로그램을 망가뜨린다
Incomplete mediation
- 유저는 가끔 data 입력할때 오타.
- 웹 어플리케이션은 유저가 입력한 것이 유효한 request인지 점검해야한다. 이를 mediation이라고 한다.
→ 그러니까 우리는 user-supplied input 값이 안전하게 well-specified values 내에 속하는지 잘 확인해야한다.
client-side mediation
- client-side mediation 폼을 적용한 웹사이트를 방문한 적이 있을 것이다.
- submit 버튼을 클릭했을 때 자바스크립트 코드가 먼저 입력한 데이터가 유효한지 체크
- 유효하지 않은 데이터를 입력했다면 popup으로 제출을 방지함
- related issue - client-side state
- 많은 웹사이트들은 client가 keep state한다고 믿지만 그들이 sever로 들어가는 hidden fields로 간다면?
- problem : what if the user..
- 자바스크립트를 끈다면?
- greasemonkey - 제출하기 전에 폼 수정
- 웹브라우저말고 웹서버랑 interacts
- manually하게 서버에 연결 - telnet server.com 80
- related issue - client-side state
incomplete mediation에 대응하는 법
- client-side mediation은 유저친화적 인터페이스로써는 OK method다. 그러나 security 목적으로는 쓸모없다.
- 따라서 server-side mediation이 필수적이다.
- 항상 모든 필드의 데이터를 체크할 수 있게
- 클라이언트가 데이터를 수정할 수 없도록
TOCTTOU errors
- time - of - check - to - time - of - use (race condition error)
- 다음과 같은 절차에 따라 일어나는 에러이다
- 유저가 시스템에 어떤 action을 수행할 것을 request. → 시스템이 그 유저가 해당 action을 수행하는 데 있어서 허용된 유저임을 확인 → 시스템이 action을 수행
- ex) 특정 unix terminal program이 setuid. 그리고 터미널을 유저에게 할당해줄 수 있음. 이는 log file을 쓸 수 있게 명령한다. 유저에게 request file을 쓸 수 있는 자격이 있는지 먼저 체크한다. 이 때 attacker는 symbolick link(바로가기) 링크를 만든다. 그리고 check와 open 사이 시점에 정보를 바꿔버린다.
- problem - 권한을 체크하는것과 오퍼레이션 실행 사이에 시스템이 바뀌어버리는 것
- 그럼 attacker는 정말 win the race 할 수 있을까??? - 추후 보완
TOCTTOU errors에 대응하는 법
- privileged action을 수행할 때, access control decision과 관련된 모든 정보가 check와 action 사이에 일치하는지 확인
- private copy를 유지하고 request가 race 도중에 바뀌지 않게 하기
- 가능하다면 object가 직접 act 할 수 있게
- 불가능하다면 race동안 object가 바뀌지 않도록 lock
Malicious code : Malware
- malware :악성 바이러스로, malicious intent로 적힌 소프트웨어의 다양한 형태
- malware의 특징 - harm을 일으키기위해 실행된다
- 어떻게 실행되나?
- user action
- malicious software를 다운로드 후 실행
- malicious ActiveX control이 포함된 웹페이지 방문
- 실행되는 이메일 오픈
- CD 삽입.. (??)
- exploting an existing flaw in a system
- network daemons의 buffer overflows
- 이메일 클라이언트나 웹브라우저의 buffer overflows
- user action
Viruses
바이러스는 다른 독립적 프로그램의 코드 내에 스스로를 주입한 다음, 그 프로그램이 악성 행동을 하고 스스로 확산되도록 강제하는 컴퓨터 코드다.
- malware중 하나로, 다른 파일을 감염시킨다.
- 원래는 바이러스는 프로그램 실행으로만 감염시킬 수 있었다. 오늘날에는 많은 데이터 도큐먼트 포맷이 실행가능한 코드를 포함한다. (macros 같은)
- 파일이 실행되면 (또는 그저 열리기만 하면) 바이러스가 활성화되고 스스로 복제되면서 다른 파일을 감염시킨다
- 이 방법으로 바이러스는 파일간, 컴퓨터간 확산된다.
Infection
- 바이러스는 이미 존재하는 nonmalicious 프로그램이나 도큐먼트를 수정하고싶어함.
- 바이러스는 dirty work를 할 수 있으며 transfer control back to the host
- 프로그램을 실행
- 매크로로 도큐먼트를 실행
- 시작프로그램 목록에 바이러스 실행 포함 - 오에스가 boot 되는 순간 감염!
Spreading
- 어떻게 컴퓨터 간 감염시키나?
- 유저가 감염된 파일을 전송 (또는 p2p네트워크- 토렌트같은)
- 바이러스는 유저액션을 요구한다
payload
- 퍼뜨리는 것 외에 바이러스는 무엇을 시도하나?
- 어떤 바이러스는 virus scanning software를 무력화시키므로써 탐지를 피함
- 대부분의 바이러스는 payload를 가짐
- 감염된 머신의 페이로드가 활성화되면 무언가가 일어남
- 지우거나 암호화됨
- 엑셀 등 문서 손상
- keystroke logger가 설치되고 온라인뱅킹 비밀번호가 캡쳐됨(모니터링)
- 특정 타겟 웹사이트 attacking
Spotting viruses
- 언제 바이러스를 찾아야 할까?
- 파일이 컴퓨터에 추가될때
- 그때그때 전체 statke를 스캔
- 어떻게 바이러스를 찾아야 할까?
- Signature-based protection
- 잘 알려진 바이러스를 리스트업
- 어떤 바이러스는 polymorphism
- list의 바이러스 목록과 비교. 탐지되었을 때 어떤건지 name 앎
- list에 없으면 탐지 불가
- behaviour-based protection
- 의심스러운 패턴에 주목. 탐지되었을 떄 name 모름
- Signature-based protection
- → 이들은 1종오류 및 2종 오류를 범할 수 있음. false negatives가 더 치명적.
Trojan horses
트로이 목마는 자가 복제는 하지 못하지만 사용자가 원하는 무언가로 위장해 자신을 활성화하도록 유도하는 방식으로 피해를 입히고 확산된다.
- 무해한 것처럼 보이나, malicious behaviour가 숨어있는 프로그램
- potentially unwanted programs (PUP)
- scareware의 형태로 유저에게 돈을 지불하게하기도 함
- 바이러스와 달리 자가복제는 못하지만 컴퓨터간 퍼지기 쉬움
Logic bombs
응용프로그램 시작 또는 특정 날짜에 도달하는 등 이벤트에 대한 응답이 트리거가 되어 실행되는 malware.
- 이 트리거는 트로이 목마에 포함되거나 프로그램 실행 등으로 만들어짐
Spotting Trojan horses & logic bombs
- 탐지하기 어려움 - 유저가 의도적으로 코드를 돌렸으니까!!!
- 나쁜 행동으로 만들어지는 payload를 예방하는 것이 최선..
Worms
웜은 독립적으로 실행되는 악의적인 소프트웨어로, 스스로를 복제하고 다른 컴퓨터로 확산된다.
- 실행 프로그램 필요 없음.
- 널리 배포된 소프트웨어의 security flaws를 이용.
The morris worm
- 최초의 인터넷 웜. 1988년 cornell이 실행함
- 한 번 감염되면 머신이 다음 세 가지 방법으로 infect
- buffer overflow → back door → dictionary attack → 비밀번호 없이 다른 머신에 퍼뜨릴 수 있음
The code red worm (2001)
Slammer worm(2003)
other malicious code
- web bugs
- back doors(trap doors)
- salami attacks
- privilege escalation
- rootkit
- keystroke logging
- interface illusion
- conflicker worm
- phishing
- man-in-the-middle attacks
- keyboard logging, interface illusion, phishing이 그 예시
- 유저간 커뮤니케이션 사이에 끼어듦
- 지금 현재 유저가 하고 있는 것을 볼 수 있을 뿐만 아니라 패스워드 캡쳐도 가능 은행에 로그인할 때 session 을 hijack하고 악성 커맨드 삽입
- 스크린에서 진짜로 일어나는 일을 볼 수 없게 속이고 … 그러니까 몰래하는 rootkit.
Uploaded by Notion2Tistory v1.1.0