레이블이 hack인 게시물을 표시합니다. 모든 게시물 표시
레이블이 hack인 게시물을 표시합니다. 모든 게시물 표시

[컴] web 에서 B site 에서 A server 로 fetch 를 보내고, B로 redirect 를 받은 경우

cors 설정 / redirect fetch / fetch cors

web 에서 B site 에서 A server 로 fetch 를 보내고, B로 redirect 를 받은 경우

  • 다음 sequence diagram 은 만약 내가 site.a.com 에 접속한 상황에서 fetch 로 api.a.com 에 request 를 했다. 그 상황에서 api.a.com 가 redirect site.a.com 를 나에게 던져준 경우이다.
  • 이 경우 예상치 못하게 cors error 가 떴다.
site.a.com 
--> fetch api.a.com
--> redirect to site.a.com

CORS error 가 뜨는 이유

CORS error 가 뜨는 이유는 Origin 이 site.a.com 이 아니라 null 로 set 돼서 site.a.com 로 request 를 보내기 때문이다. 그렇게 되면, browser 에서 orgin 과 서버가 보낸 Access-Control-Allow-Origin 값을 비교할 때 두 값이 달라서 error 를 던지게 된다.(아래 Fetch: Cross-Origin Requests 부분 참고)

  • 여기를 보면, 처음 request 를 보낸 url에서 바뀐적이 있으면, redirect-tainted origin 으로 본다. 그렇기에 Origin 이 null 로 잡힌다.
  • 이러면 origin 이 ‘null’ 로 바뀌었다고 봐야 하기 때문에 site.a.com 에서 CORS 를 지원하기 위한 설정을 잡아줘야 한다.

CORS error 가 없이 동작할 때

다음처럼 api.a.com 으로 보내고 api.a.com 으로 redirect 되는 경우는 다음처럼 CORS error 가 안뜨고, 잘 동작한다.

api.a.com, api.a.com

CORS error 가 안뜨게 수정

  • 아래는 이때 CORS error 가 뜨지 않도록 header 를 맞춰준 예시이다.

조정한 내용:

  • Accee-Control-Allow-Origin: null
  • Access-Control-Allow-Credentials: true
  • Access-Control-Allow-HeadersAccess-Control-Request-Headers 에서 요청한 header를 넣어준다.
  • Access-Control-Allow-MethodsAccess-Control-Request-Method에 맞춰서 지정

api.a.com 으로 보내고 site.a.com 으로 redirect 되는 경우 : mermaid link

api.a.com, site.a.com

fetch 를 사용할 때 redirect :

CORS error 가 안뜨게 하려면

CORS error 가 안뜨게 하려면, 다음처럼 설정을 하면 된다.

client :

  • `credentials : ‘omit’
  • mode : 'no-cors'

server :

  • Access-Control-Allowed-Origin: *
  • Access-Control-Allow-Credentials: false

Fetch: Cross-Origin Requests

  • client 에서 Origin을 보내면, 그것을 server가 본다.
  • server 는 그에 따라 Access-Control-Allow-Origin 을 만들어서 response 에 보낸다.
  • browser 가 trusted mediator(신뢰할 수 있는 중재자) 역할을 한다. 즉, browser가 이제 client 에서 보냈던 origin 이랑 서버가 보낸 Access-Control-Allow-Origin 값을 비교해서 값이 적절하면, javascript 가 response 값을 access 할 수 있게 해준다.

javascript 가 기본적으로 접근할 수 있는 safe header 는 다음과 같다.

  • Cache-Control
  • Content-Language
  • Content-Length
  • Content-Type
  • Expires
  • Last-Modified
  • Pragma

js 가 다른 header 에 접근하고 싶어도 browser가 접근을 막는다. 다만 server 에서 Access-Control-Expose-Headers 에 추가된 header는 browser가 js 한테 열어준다.

이제는 browser가 안전하지 않은 요청(unsafe request)는 바로 날리지 않는다. preflight request 를 먼저 날리고 나서 날리게 된다.

  • Access-Control-Request-Method : 어떤 method 로 보내려는지 적는다.
  • Access-Control-Request-Headers : 보내려는 request 가 갖고 있는 header들을 적는다.
  • Origin : request 가 어디서 보내는 request 인지를 적게 된다.
200 OK
Content-Type:text/html; charset=UTF-8
Content-Length: 12345
Content-Encoding: gzip
API-Key: 2c9de507f2c54aa1
Access-Control-Allow-Origin: https://javascript.info
Access-Control-Expose-Headers: Content-Encoding,API-Key

서버단에서 redirect 시켜서 CORS 피하기

                              ┌─►  http://localhost:8081       
   http://localhost:8080      │     ┌─────────────┐            
                              │     │             │            
   http://localhost:8080/api──┘     │   WAS       │            
     ┌─────────────┐                │             │            
     │ web server  │                │             │            
     │     ┌───────┤                │             │            
     │     │       │                └─────────────┘            
     │     │ asset │                                           
     │     │       │                                           
     └─────┴───────┘                                           

[컴][네트워크] android packet capture 방법

/ pc ap역할/ 패킷 캡쳐 / android windows capture

android packet capture 방법

  1. tPacketCapture - Apps on Google Play : 이 녀석은 좋다. 다만 최근 버전에서는 이 녀석을 사용할 수 없다. 왜냐하면 저장한 파일을 다른 곳으로 전송할 수가 없다. ’공유(share)’도 제대로 동작하지 않는다. 다만 ’블루투스’는 시도해보지 않았다.

                    xxx x x xxxx
                x xx           xx x
            xxxx                     x   x xxxxxxx
        xxxx                          xx         x
       xx                                        x
       x            internet                  xxx
        x                                    x x
        xxx xx xxx                              x
             xxx  xx                             x
                   xxxxxx x   xxxxx x   xxx   x xx
                        ▲             xx  xxx
                        │
               ┌────────┘
               │
        ┌──────┴───────┐          ┌───────────────────┐
        │              │          │                   │
        │  acess       │          │                   │
        │  point       │◄─────────┤   android phone   │
        │ (windows PC) │          │                   │
        │              │          └───────────────────┘
        └──────────────┘

  1. 컴퓨터를 안드로이드폰과 같은 네트워크(LAN) 에 둔다.
  2. wireless access point 역할을 하도록 한다.
    • windows10 에서는 settings –> Network & internet –> Mobile hotspot [ref. 2]
  3. wireshark 로 packet 을 잡는다.

fiddler 로 capture

이것은 web browser 의 packet 을 잡을 때 유용하다.

  1. fiddler classic download : https://www.telerik.com/download/fiddler/fiddler4
  2. extension CertMaker for iOS and Android’ 설치 : https://telerik-fiddler.s3.amazonaws.com/fiddler/addons/fiddlercertmaker.exe
  3. options –> https tab –> Capture HTTPS CONNECTs –> Decript HTTPS traffic (ignore server certificate errors 를 check 할 필요가 있을 수 있다.)
  4. options –> connections tab –> Allow remote computers to connect
  5. android phone 에서 현재 연결된 AP 설정화면에서 proxy setting(프록시) 를 수동(manual) 로 해서 proxy 를 추가한다.
    • fiddler 가 있는 pc의 ip address (여기서는 192.168.0.1 이라고 하자.)
    • fiddler 에 설정된 port 로 설정(여기서는 8888이라고 하자.)
  6. android phone 에서 web browser 로 http://192.168.0.1:8888 로 접속한다.
  7. Fiddler cert 를 download : 화면에 Fiddler cert 를 download 할 수 있는 link 가 있다.
  8. android 에서 ‘CA 인증서’ 설치로 위에서 다운로드한 cert 를 설치한다. –> 작업이 끝나면 삭제하자.
  9. 이제 원하는 site 에 접속하면, fiddler 에 request 내용 이 잡힌다.


                    xxx x x xxxx
                x xx           xx x
            xxxx                     x   x xxxxxxx
        xxxx                          xx         x
       xx                                        x
       x            internet                  xxx
        x                                    x x
        xxx xx xxx                              x
             xxx  xx                             x
                   xxxxxx x   xxxxx x   xxx   x xx
                        ▲             xx  xxx
                        │
               ┌────────┘
               │
        ┌──────┴───────┐          ┌───────────────────┐
        │              │          │                   │
        │  proxy       │          │                   │
        │  (fiddler)   │◄─────────┤   android phone   │
        │ (windows PC) │          │                   │
        │              │          └───────────────────┘
        └──────────────┘

fiddler classic 에서 Bouncy Castle certificate 을 사용하는 법[ref. 3]

  1. extension ‘CertMaker for iOS and Android’ 을 download : https://telerik-fiddler.s3.amazonaws.com/fiddler/addons/fiddlercertmaker.exe
    • 이 extension 을 설치하면 만기가 2년인 cert 가 만들어진다. 이 extension 을 설치하지 않으면 만기가 아주 긴 cert 가 만들어진다.
  2. ’실행’하면 설치가 완료된다.

설치된 인증서 삭제

windows 의 경우:

Reference

  1. android - Capturing mobile phone traffic on Wireshark - Stack Overflow
  2. Use your Windows PC as a mobile hotspot - Microsoft Support
  3. How to use Bouncy Castle certificates generator in Fiddler | Telerik Forums

[컴] LG유플러스 해킹, 2022~2023

해커 / 해킹 / 엘지 / 통신사 / 웹셀 /

LG유플러스 해킹, 2022~2023

과학기술정보통신부와 한국인터넷진흥원(KISA)은 2023-04-27 정부서울청사에서 ’LG유플러스 사이버 침해사고 원인분석 및 조치방안’을 발표하고 해킹당한 개인정보가 LG유플러스 고객정보가 맞다고 밝혔다.

LG유플러스가 해커로부터 확보한 데이터 60만건을 분석:

  • 데이터베이스(DB) 형태의 텍스트 파일로 26개 칼럼으로 구성돼 있다.
  • 동일인 중복 데이터를 제거해 29만6477명의 정보를 확인
  • 또 LG유플러스가 해커로부터 추가로 확보한 이미지로 된 데이터 --> 1039명의 정보를 새로 확보했다. 다만 이 중 399명의 정보는 DB에서 정확히 확인되지 않음.

해킹 방법

KISA 의 분석:

  • 파일유출 시점은 마지막 업데이트가 이뤄진 2018년 6월15일 오전 3시58분 직후로 보인다 --> 누군가 관리자 계정에 웹셸 같은 악성코드를 설치 --> 정확한 유출 경로는 2018년 당시 DB 접속 로그 정보가 거의 남아 있지 않아 조사에 한계

  • 해커가 웹셸(webshell) 방식을 이용해 개인정보를 탈취했을 것으로 추정

  • webshell 공격 me: 생각보다 간단하다. web page 또는 api 를 열어놓는다. 그래서 특정 인자를 받으면, 관련해서 system command 를 실행할 수 있게 만들어 놓는다. php 에서는 간단히 아래처럼 가능하다. 다만 이번 경우는 db 이기에 아마도 db 관련 query 를 마음대로 사용할 수 있도록 webshell 을 작성했을 듯.

    // localhost/test.php?q=ls
    <?php system($_GET['q']); ?>

해킹을 당한 이유

  • 고객인증 DB의 관리자 계정의 암호를 초기암호로 방치 –> 해킹(웹셸 방식)
  • 모니터링 시스템 부재 : 대용량 데이터 외부 유출 시 비정상 행위를 실시간 감시할 수 없었다.
  • 정보보안관련 예산 및 인원이 3사중 가장 적다, (LG유플러스: 292억원, 91명)

2022년 통신 3사의 정보보호 투자액과 담당 직원

  • LG유플러스: 292억원, 91명
  • SK텔레콤: 860억원, 305명
  • KT: 1021억원, 336명

2023년 초 LG유플러스 서비스 장애를 일으킨 분산서비스거부(DDos·디도스) 공격

  • 라우터에 과부하를 유발하는 수법
  • 당시 LG유플러스는 68개 이상의 라우터 정보가 외부에 노출
    • 신뢰할 수 없는 장비와 통신이 가능한 상태
  • ’포트 스캔’을 통해 LG유플러스 라우터를 특정하고 노출된 포트를 대상으로 디도스 공격
  • ‘접근제어 정책’(Access control policy)을 통해 라우터 간 통신 유형을 제한하지만 이 같은 조치가 미흡
  • 1월29일과 2월4일 총 5회
    • 공격자는 1월29일 3회에 걸쳐 63분 동안 주요 네트워크 장비 14대를 공격했고 전국적으로 서비스 장애
    • 2월4일에도 2회에 걸쳐 57분 동안 일부 지역 엣지 라우터 320대를 공격해 장애가 생겼다.
    • 공격 IP가 변조돼 디도스 공격 주체가 누구인지 파악하지 못했다.

Reference

  1. “LG유플, 고객DB 암호 관리부실로 원격해킹에 약 30만명 정보 유출”

[컴] 한국 금융 회사 보안 솔루션 문제

은행/ 증권 / 시스템 / 보안 / 해킹 / 금융 보안

한국 금융 회사 보안 솔루션 문제

Adblock Plus로 유명한 독일의 개발자 블라디미르 팔란트(Wladimir Palant)의 글

다 읽기 귀찮으면, “한국의 금융보안: 중간 결론”" 만 읽어도 충분하다.

이정도 수준인데도 큰일 없는 것 보면, 확실히 보안은 애매한 것 같다.

우리 금융회사 시스템은 점차 바뀌어야 할 시점인듯 싶다.

windows의 인증서 관리 콘솔

우리나라 보안업체의 무지한 대답

  1. 보안 취약점 저격 당한 국내 보안업계 “국내 환경 이해 부족” - 군사 마이너 갤러리, 2023-01-16

팔란트는 해당 취약점을 2022년 10월 한국인터넷진흥원(KISA) 인터넷보호나라(KRcert)에 먼저 신고했다. 이번에 그는 라온시큐어와 직접 연락하고자 했지만 연락 수단이 전화번호 외에는 없었다고 밝혔다.

이 같은 언급에 라온시큐어는 12일 이뉴스투데이와 통화에서 다른 의견을 제시했다. 라온시큐어 관계자는 “지난해 KISA로부터 전달받은 내용을 바탕으로 해당 취약점을 보완하는 패치를 개발 완료했다. 하지만 이용사 일정에 맞춰 적용해야 해서 아직 배포하지 못했다”고 해명했다.

이어 그는 “솔루션 취약점에 대한 공유는 솔루션을 발전시킬 수 있어 바람직하다”며 “그러나 이번 건(취약점 지적)은 국내 보안 시장 환경자체를 충분히 이해하지 못했다고 본다”고 반박했다.

그는 “키보드 보안은 호환성이나 시스템 레벨 접근과 같은 권한이 필요한 특이상황으로 C언어를 사용할 이유가 있다”며 “개발사가 환경이나 특성에 맞게 언어를 선택해 개발하고 있고, C++이 C보다 더 좋다고 해서 무조건 변경해야 하는 것은 아니다”라고 말했다. 건축 양식이 각 나라 환경에 맞게 발전하듯 보안 프로그램도 한국 상황에 맞게 만들어지고 있다는 설명이다.

라온시큐어에 따르면 PC로 은행 업무를 볼 때 설치하는 보안프로그램은 서로 연계가 돼, 하나의 보안 프로그램이 해킹의 위험에 노출되더라도 (다른 프로그램 도움을 받아) 방어할 수 있다. PC로 은행 업무를 볼 때 설치하는 여러 보안 프로그램이 각자 담당 영역을 나눠 해킹 위협으로부터 방어하는데, 이것이 은행의 보안 대책이라는 설명이다.

라온시큐어 관계자는 “(팔란트가) 국내 상황을 충분히 이해하지 못한 상태에서 당장 개발 언어를 바꿔야 안전하다고 말하는 것은 단편적인 부분만 바라본 것”이라고 주장했다.

그는 “라온시큐어 내부 방침으로 KISA와 공식적인 루트를 통해 일을 진행한다”며 “취약점이 밝혀지면 KISA와 긴밀하게 협의해 개발 일정을 지속적으로 보고하며 진행하고, 이번에도 그 절차를 밟았다”고 이야기했다.

See Also

  1. 보안공지 > 알림마당 : KISA 인터넷 보호나라&KrCERT
  2. 北 해커, KT 금융보안기업 이니텍 해킹··· 국정원·KISA가 적발
  3. 北 해커, KT 금융보안기업 이니텍 해킹··· 국정원·KISA가 적발 : 클리앙
  4. "해킹 강국 북한"…美 해킹대회 1~4위 '북한 대학생', 2023-07-07

[컴] Rx.js 에서 새로운 스케쥴러를 사용하는 경우

rxjs / reactx

Rx.js 에서 새로운 스케쥴러를 사용하는 경우

Observable 에 새로운 scheduler 를 set 하는 경우를 보자. 코드는 다음과 같다.

const myObservable2 = new rxjs.Observable(proxyObserver => {
    console.log('Observalbe');
    proxyObserver.next(42);
    proxyObserver.next(100);
    proxyObserver.complete();
  }
).pipe(
  rxjs.operators.observeOn(rxjs.asyncScheduler)
);

var finalObserver = {
    next(x) {
      console.log('got value ' + x)
    },
    error(err) {
      console.error('something wrong occurred: ' + err);
    },
    complete() {
       console.log('done');
    }
  };
console.log('just before subscribe');
myObservable2.subscribe(finalObserver);
console.log('just after subscribe');

간략한 코드 흐름, code flow

Observable()
  operators.observeOn(rxjs.asyncScheduler)
    const operateRetFn = operate(callback1)
  Observable.pipe(operateRetFn)
    pipeFromArray(operations)(this)
      operateRetFn(this)
        const newObservable = Observable.lift(callback2)

자세한 code flow

function Observable(subscribe) {
    if (subscribe) {
        this._subscribe = subscribe;
    }
}

function observeOn(scheduler, delay) {
    if (delay === void 0) { delay = 0; }
    return operate(function (source, subscriber) {  // callback1
        source.subscribe(
            new OperatorSubscriber(subscriber, function (value) { 
                    return subscriber.add(
                        scheduler.schedule(function () { 
                            return subscriber.next(value); 
                        }, delay)
                    ); 
                }, function () { 
                    return subscriber.add(
                        scheduler.schedule(function () { 
                            return subscriber.complete(); 
                        }, delay)
                    ); 
                }, function (err) { 
                    return subscriber.add(
                        scheduler.schedule(function () { 
                            return subscriber.error(err); 
                        }, delay)
                    ); 
                }
            )
        );
    });
}


function operate(init) {
    return function (source) {  // `operateRetFn`
        if (hasLift(source)) {
            return source.lift(function (liftedSource) {    // `callback2`
                try {
                    return init(liftedSource, this);    // `callback1` is invoked
                }
                ...
            });
        }
        throw new TypeError('Unable to lift unknown Observable type');
    };
}

Observable.prototype.pipe = function () {
    var operations = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        operations[_i] = arguments[_i];
    }
    return operations.length ? pipeFromArray(operations)(this) : this;
};

function pipeFromArray(fns) {
    ...
    if (fns.length === 1) {
        return fns[0];  // `operateRetFn` function
    }
    return function piped(input) {
        return fns.reduce(function (prev, fn) { return fn(prev); }, input);
    };
}


Observable.prototype.lift = function (operator) {
    var observable$$1 = new Observable();
    observable$$1.source = this;
    observable$$1.operator = operator;  // `callback2`
    return observable$$1;
};


Observable.prototype.subscribe = function (observerOrNext, error, complete) {
    var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);
    if (config.useDeprecatedSynchronousErrorHandling) {
        ...
    }
    else {
        var _a = this, operator = _a.operator, source = _a.source;
        subscriber.add(operator
            ? operator.call(subscriber, source)  // 최종적으로 callback1 이 호출된다.`
            : ...
    }
    return subscriber;
};

See Also

  1. 쿠…sal: [컴] Rx.js 에서 Observable.subscribe 의 동작

References

  1. RxJS - Scheduler

[컴] Rx.js 에서 Observable.subscribe 의 동작

rxjs

Rx.js 에서 Observable.subscribe 의 동작

전체 흐름

  1. Observable.subscribe 을 호출
  2. –> Observable 생성시 등록한 callback(subscriber) 호출
  3. –> callback 안에서 subscriber.next(val)
  4. –> subscribe 시 등록한 subscriber function 을 호출
console.clear();
const myObservable = new rxjs.Observable(subscriber => {
  console.log('Observalbe');
  subscriber.next(42);
  subscriber.next(100);
  setTimeout(() => {
    subscriber.next(300); // happens asynchronously
  }, 1000);
});

myObservable.subscribe(x => {
  console.log(x);
});

myObservable.subscribe(x => {
  console.log('x2 : ' + x);
});

event 마다 해당하는 handler 를 전부 호출 하는 것이 아니다.

대체로 event 를 dispatch 하는 경우에는 event 마다 handler 의 list 를 가지고 있고, 그 event 가 호출될 때마다 해당하는 handler 를 전부 호출하는 구조이다.

하지만 여기는 다르다. 직접 실행해 보면 알겠지만, myObservable.subscribe 를 호출하는 시점에 Observable 로 등록한 function 이 동작을 시작한다. 그래서 그 안에서 subscriber.next() 를 호출하면 비로서 우리가 subscribe 을 호출하면서 등록한 function 이 실행된다.

그래서 위처럼 2번을 subscribe 해보면, 순차적으로 첫번째 subscribe 에 대한 호출이 끝나고 나서, x2에 대한 처리가 되는 것을 확인할 수 있다.

아래 글을 참고하면 좋을 듯 하다.

- ref. 1 에서 -

This is drastically different to event handler APIs like addEventListener / removeEventListener. With observable.subscribe, the given Observer is not registered as a listener in the Observable. The Observable does not even maintain a list of attached Observers.

A subscribe call is simply a way to start an “Observable execution” and deliver values or events to an Observer of that execution.

자세한 code

subscriber.next(10)
  Subscriber._next
    callback function of myObservable

subscriber.next(10)
Subscriber.prototype.next = function (value) {
    if (this.isStopped) {
        ...
    }
    else {
        this._next(value);
    }
};
Subscriber.prototype._next = function (value) {
    this.destination.next(value);
};
function wrapForErrorHandling(handler, instance) {
    return function () {
        ...
        try {
            handler.apply(void 0, __spreadArray([], __read(args)));
        }
        catch (err) {
            ...
        }
    };
}
// myObservable.subscribe(
x => {
    console.log(x);
}

myObservable.subscribe()
    Observable._trySubscribe(subscriber)
      Observable._subscribe(sink)
        Observable's callback function
       

myObservable.subscribe(x => console.log(x))
Observable.prototype.subscribe = function (observerOrNext, error, complete) {
    var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);
    if (config.useDeprecatedSynchronousErrorHandling) {
        ...
    }
    else {
        ...
        this._trySubscribe(subscriber));
    }
    return subscriber;
};
Observable.prototype._trySubscribe = function (sink) {
    try {
        return this._subscribe(sink);
    }
    ...
};
// const myObservable = new rxjs.Observable(
subscriber => {
  console.log('Observalbe');
  subscriber.next(42);
  ...

sample source

위에서 사용한 code이다.

See Also

  1. 쿠…sal: [컴] Rx.js 에서 새로운 스케쥴러를 사용하는 경우
  2. https://gist.github.com/staltz/868e7e9bc2a7b8c1f754#request-and-response : request, response 의 경우 어떻게 stream 으로 만드는 지에 대한 좋은 예시

References

  1. RxJS - Observable

[컴][os] Windows SandBox

 win10 / 샌드박스 / isolation / vm / 가상머신 / 금융어플 사용 / 금융 프로그램 사용 /

Windows SandBox

2019 년 MS 가 발표했다.

쉽게 이야기하면, vm 에 windows 를 새롭게 설치해서 사용하는 것처럼 새롭게 설치한 초기화된 windows 를 사용할 수 있게 해준다.(하지만 vm 대신에 container 를 사용한다.)

sandbox 특징

  • windows 10 Pro/Enterprise 에서 실행된다.
  • Hyper-V 위에서 실행된다.
  • 시작할 때마다 새롭게 만들어지고, 닫으면 현재 상태가 날라간다.
  • WSB format 을 사용한다. 이 file 은 config file 을 이용해서 설정할 수 있다.
    • network, vGPU, script 등 이 가능하다.
  • Windows Containers 기술에 기반한 배포.
  • Windows Container 기술과 Hyper-V 기술을 사용한다.
    • 몇년전 MS 가 windows server 용으로 Windows Container 를 발표했다. 이 기능으로 Docker 를 windows 에서 돌릴 수 있게 해줬다.

base image

  • windows 가 sandbox 자체를 customization 을 허락하지 않기 때문에 우리가 원하는 base image 를 만들 수는 없다.
  • sandbox path :%programdata%\Microsoft\Windows\Containers

sandbox 의 3개 구성요소

  1. CmService.dll(svchost.exe): Container Manager Service
    • .wil file 을 unpack 한다.
    • template VHDx file 을 만든다. 모든 Hyper-V based VM 은 machine 이 사용하는 virtual disk 를 표현하는 VHDx file 을 사용한다.
    • unpack 한 .wil file 을 이용해서 base layer를 만들고 이것을 mount 한다.
  2. vmcompute.exe: Hyper-V Host Compute Service
    • 설정파일을 읽고, container 를 만든다.
    • VM worker process 를 생성한다.
    • vSMB path 들을 만든다.
  3. vmwp.exe: Virtual Machine Worker Process
    • VM file들(VHDX/VMGS) 를 load 한다.
    • vSMB server 를 만든다.

sandbox configuration

샌드박스 설정방법은 다음 링크들을 참고하자.

  1. Windows Sandbox configuration - Windows security | Microsoft Docs
  2. How to configure Windows Sandbox on Windows 10 | Windows Central

file 전송

간단하다. windows <--> windows sandbox 사이에 copy-and-paste 가 된다.

See Also

Reference

  1. Playing in the (Windows) Sandbox - Check Point Research, 2021-03-11

[컴] HDD drive 수명

하드드라이브 오래 / 얼마나 사용할 수 있을까? 수명/ 하드 수명 / 하드 오래쓰는 / 얼마나 오래쓸까?

HDD drive 수명

다음 링크에서 BackBlaze 가 자신들의 HDD 드라이브 사용한 경험을 가지고 하드드라이브 수명이 얼마나 되는지 이야기 해준다.

BackBlaze 에 따르면, HDD 평균 기대수명은 10년이 되기전에 대체로 닳아서 못쓰게 된다고 한다. 물론 이것은 평균이라서 10년을 넘어서 20~30년 사용되는 것도 있고, 정말 초기에 망가지는 것도 있다고 한다.

대체로 그들의 HDD 는 구입후 4년후에 약 80%가 잘 돌아가고 있다고 한다.

주의 : BackBlaze 는 클라우드 백업 서비스를 제공하는 회사다. 그래서 이 HDD 의 수명은 가정용으로 사용하는 경우보다는 계속해서 빡세게 하드를 사용할 경우를 이야기 한다.

그외 자료들

google, CMU 의 연구


  • 구글
    • 온도는 수명에 큰 영향을 주지 않았다.
    • drive의 SMART checks 는 drive 의 실패를 그렇게 잘 예측하지 못한다.
  • CMU’s study
    • 제조자의 실패 간격의 평균(mean time between failures, MTBF) 비율들은 과장되어 있다. 드라이브들은 MTBF 보다 더 많이 실패한다.

[컴][알고리즘] BFS breadth-first search

너비 우선 탐색 / bfs /









BFS breadth-first search

vertex s 에서 출발한다.

s 의 adj 는 A, B 이니,
먼저, A 가 level 에 있는지 본다.
A가 level 에 없으니 A에 대한 level (level['A']) 를 set 한다.
그 다음 B 가 level 에 있는지 본다.
B도 level 에 없으니 B에 대한 level (level['B']) 를 set 한다.
그리고 방문했던 A, B는 next 에 저장해 놓는다.
그래서 그 다음에 loop 을 돌 frontier 를 만들게 된다.

frontier 의 각 adj vertex 들을 접근하면서,
각 vertex 가 방문했는지를 level 이 채워져 있는지로 확인한다.
이미 방문한 애들은 그냥 skip 한다.

prarent 는 각 vertex 가 어디서 부터 왔는지를 저장한다. 이것을 거꾸로 하면, path 가 된다.

level = {}
parent = {}

def bfs(s, adj):
    level = {"s": 0}
    parent = {"s": None}
    i = 1
    frontier = [s] # level i-1
    while frontier:
        next = [] # level i
        for u in frontier:
            for v in adj[u]:
                if v not in level:
                    level[v] = i
                    parent[v] = u
                    next.append(v)
        frontier = next
        i += 1     
이 bfs 를 한번 돌리면, 연결된 "하나의 연결된 그래프"의 vertex 들을 전부 visit 하게 된다. 그리고 현재의 연결된 그래프와 연결되지 않은, 나머지 vertex 의 방문을 위해서는 bfs 를 다시 실행해야 한다.

See Also

  1. [컴][알고리즘] Depth-First Search DFS, 깊이우선 탐색

References

  1. 13. Breadth-First Search (BFS) - YouTube


[컴][웹] firefox 에서 보안설정 간편하게 하기

firefox 보안 / 파폭 설치 후  / 파이어폭스

firefox 에서 보안설정 간편하게 하기

user.js 를 이용해서 설정을 간단하게 할 수 있다.

user.js

주의할 점은 user.js 에 설정된 값은 firefox 내에서 수정해도, firefox 를 껐다켜면 다시 값을 user.js 로 복구시킨다. 한번 사용하고 user.js 는 지우면된다.

  • profile folder:
    • Windows: %APPDATA%\Mozilla\Firefox\Profiles\
    • Linux: /home/<USRNAME>/.mozilla/random.default.
    • Android: /data/data/org.mozilla.firefox/files/mozilla/xxxxxxxx.default/
  • profile folder 에 user.js 를 copy 해 놓으면 된다. 그러면 firefox 가 시작할 때 user.js 의 내용을 prefs.js 로 내용을 copy 한다.(참고: User.js file - MozillaZine Knowledge Base)
  • backup : 혹시 모르니 prefs.js 를 backup 해 놓자.
  • firefox 를 닫고 나서 작업을 하고 다시 켜자.(android 에서는 '강제종료'를 하고 하자.)

UTC Time zone

resistFingerprinting 가 기본 timezone 을 UTC 로 설정한다. 그래서 일부 website 에서 시간정보가 제대로 보이지 않을 수 있다. 참고하자. (firefox 79.0)

user.js

example

아래 예제는 ref.2 에서 가져와서, 몇개를 수정했다.

// Heimdallr -- Added -- Privacy Enhanced
// Disable Telemetry
user_pref("browser.urlbar.trimURLs","false");  
user_pref("browser.newtabpage.activity-stream.feeds.telemetry","false");
user_pref("browser.newtabpage.activity-stream.telemetry","false");
user_pref("browser.pingcentre.telemetry","false");
user_pref("devtools.onboarding.telemetry-logged","false");
user_pref("media.wmf.deblacklisting-for-telemetry-in-gpu-process","false");
user_pref("toolkit.telemetry.archive.enabled","false");
user_pref("toolkit.telemetry.bhrping.enabled","false");
user_pref("toolkit.telemetry.firstshutdownping.enabled","false");
user_pref("toolkit.telemetry.hybridcontent.enabled","false");
user_pref("toolkit.telemetry.newprofileping.enabled","false");
user_pref("toolkit.telemetry.unified","false");
user_pref("toolkit.telemetry.updateping.enabled","false");
user_pref("toolkit.telemetry.shutdownpingsender.enabled","false");

// Disable Plugin Scanning
user_pref("plugin.scan.plid.all","false");

// Disable Geolocation
user_pref("geo.enabled","false");

// Disable all disk caching PERIOD
user_pref("browser.cache.disk.enable","false");
user_pref("browser.cache.disk_cache_ssl","false");
user_pref("browser.cache.memory.enable","false");
user_pref("browser.cache.offline.enable","false");
user_pref("browser.cache.insecure.enable","false");

// Disable formfill
user_pref("browser.formfill.enable","false");

// Disable Zero Round Trip Time Resumption
user_pref("security.tls.enable_0rtt_data","false");

// Use only TLS 1.2 and 1.3
user_pref("security.tls.version.min","3");

// Disable Triple DES cipher
user_pref("security.ssl3.rsa_des_ede3_sha","false");

// Use strongest cipher
user_pref("security.ssl3.dhe_rsa_aes_128_sha", false);
user_pref("security.ssl3.ecdhe_ecdsa_aes_128_gcm_sha256", false);
user_pref("security.ssl3.ecdhe_ecdsa_aes_128_sha", false);
user_pref("security.ssl3.ecdhe_rsa_aes_128_gcm_sha256", false);
user_pref("security.ssl3.ecdhe_rsa_aes_128_sha", false);
user_pref("security.ssl3.rsa_aes_128_sha", false);

// Evade Finger printing
user_pref("privacy.resistfingerprinting","true");

// Disable the HORRIBLE webRTC
user_pref("media.peerconnection.enabled","false");

// Disable Prefetching
user_pref("network.dns.disablePrefetch","true");
user_pref("network.prefetch-next","false");

// Disable Referrer Headers (WHY is this is a thing)
user_pref("network.http.sendRefererHeader","0");

// Disable direct GPU access (WEBGL)
user_pref("webgl.disabled","true");

// Disable battery life check
user_pref("dom.battery.enabled","false");

// Disable session identifier
user_pref("security.ssl.disable_session_identifiers","true")

// Make requests only to site being visited
user_pref("privacy.firstparty.isolate","true")

// Disable auth fast starts 
user_pref("security.ssl.enable_false_start","false")

// Disable new tab privacy concerns
user_pref("accessibility.force_disabled", 1);
user_pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons", false);
user_pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features", false);
user_pref("browser.newtabpage.activity-stream.feeds.section.highlights", false);
user_pref("browser.newtabpage.activity-stream.feeds.section.topstories", false);
user_pref("browser.newtabpage.activity-stream.feeds.section.topstories.rec.impressions", "{\"50465\":1576448311544,\"50504\":1576448311544,\"50513\":1576448311544}");
user_pref("browser.newtabpage.activity-stream.feeds.section.topstories.spoc.impressions", "{\"2323\":[1576448311615,1576448311641,1576448317243]}");
user_pref("browser.newtabpage.activity-stream.feeds.snippets", false);
user_pref("browser.newtabpage.activity-stream.feeds.telemetry", false);
user_pref("browser.newtabpage.activity-stream.feeds.topsites", false);
user_pref("browser.newtabpage.activity-stream.impressionId", "{bc349b2a-4696-4afa-bf4f-48d1fd919fe0}");
user_pref("browser.newtabpage.activity-stream.improvesearch.topSiteSearchShortcuts.havePinned", "google,amazon");
user_pref("browser.newtabpage.activity-stream.prerender", false);
user_pref("browser.newtabpage.activity-stream.section.highlights.includeBookmarks", false);
user_pref("browser.newtabpage.activity-stream.section.highlights.includeDownloads", false);
user_pref("browser.newtabpage.activity-stream.section.highlights.includePocket", false);
user_pref("browser.newtabpage.activity-stream.section.highlights.includeVisited", false);
user_pref("browser.newtabpage.activity-stream.showSearch", false);
user_pref("browser.newtabpage.activity-stream.showSponsored", false);
user_pref("browser.newtabpage.enabled", false);
user_pref("browser.newtabpage.storageVersion", 1);

// Disable spell check and enable clear on shutdown
user_pref("layout.spellcheckDefault", 0);
user_pref("network.cookie.cookieBehavior", 4);
user_pref("network.cookie.lifetimePolicy", 2);
user_pref("network.http.speculative-parallel-limit", 0);
user_pref("network.trr.mode", 2);
user_pref("pdfjs.enabledCache.state", true);
user_pref("pdfjs.migrationVersion", 2);

// Correct Permissions
user_pref("permissions.default.camera", 2);
user_pref("permissions.default.desktop-notification", 2);
user_pref("permissions.default.geo", 2);
user_pref("permissions.default.microphone", 2);

// Enable privacy sanitization and disable PDF full page
user_pref("plugin.disable_full_page_plugin_for_types", "application/pdf");
user_pref("pref.privacy.disable_button.cookie_exceptions", false);
user_pref("privacy.clearOnShutdown.downloads", true);
user_pref("privacy.clearOnShutdown.formdata", true);
user_pref("privacy.clearOnShutdown.history", true);
user_pref("privacy.clearOnShutdown.offlineApps", true);
user_pref("privacy.clearOnShutdown.sessions", true);
user_pref("privacy.clearOnShutdown.siteSettings", true);
user_pref("privacy.donottrackheader.enabled", true);
user_pref("privacy.history.custom", true);
user_pref("privacy.resistFingerprinting", true);
user_pref("privacy.sanitize.pending", "[]");
user_pref("privacy.sanitize.sanitizeOnShutdown", true);
user_pref("privacy.trackingprotection.cryptomining.enabled", true);
user_pref("privacy.trackingprotection.enabled", true);
user_pref("privacy.trackingprotection.fingerprinting.enabled", true);
user_pref("toolkit.telemetry.reportingpolicy.firstRun", false);
user_pref("trailhead.firstrun.didSeeAboutWelcome", true);

See Also

  1. http://browserspy.dk/: 자신의 브라우저가 어떤 정보를 노출시키는지 확인할 수 있다.
  2. GitHub - yokoffing/Betterfox: user.js file to harden Firefox and optimize privacy, security, and speed : 여러가지 preset 들이 있다.
  3. 쿠...sal: [컴][웹] firefox 보안 관련 설정

Reference

  1. Profiles - Where Firefox stores your bookmarks, passwords and other user data | Firefox Help
  2. Firefox Hardening Tips 2019 - Wikis & How-to Guides - Level1Techs Forums, 2019-01-18
  3. Guide: Hardening Mozilla Firefox For Privacy & Security 2016 | Cyber Security Wiki | Viking VPN Service

[컴][폰] tfp0 patch


tfp0 patch 가 뭐지? patch 

tfp0 patch

task_for_pid

XNU 커널에서 task_for_pid는 privileged process가 동일한 host에 있는 다른 process의 task port를 가져 오도록하는 기능.

  • 커널 task (프로세스 ID 0)는 가져올 수 없다.

tfp0 패치

tfp0 패치 (또는 task_for_pid (0) 패치)는 이 제한(kernel task 를 가져올 수 없는 제한)을 제거한다.

  • 그래서 "root로 실행중인 모든 실행 파일"이 pid 0 (따라서 이름)에 대해 task_for_pid를 호출 하고, vm_read 및 vm_write를 사용하여 커널 VM 영역을 수정하는 것이 가능해 진다.
  • AMFI(AppleMobileFileIntegrity - The iPhone Wiki)를 만족 시키려면 get-task-allow 자격과 task_for_pid-allow 자격(entitlement)이 필요.

Reference

[컴][네트워크] 라우팅 프로토콜

routing protocol / router / 라우팅 프로토콜  / 어떻게 패킷이 가는가 / 네트워크 알고리즘


라우팅 프로토콜

routing protocol은 3가지 형식으로 분류할 수 있다.
  1. routing table 을 누가 만드느냐에 따라 분류
  2. 내부 network에서 routing을 담당하느냐에 따른 분류
  3. routing table을 어떻게 만드느냐에 따른 분류

routing table 을 누가 만드느냐에 따라 분류

스태틱 라우팅 프로토콜(static routing protocol)

  • 사람이 직접 손으로 routing table(라우팅 테이블)을 만드는 것이다.
  • 경로에 문제가 발생하면, 다시 사람이 고쳐주지 않는 한 문제를 해결하지 못한다.

다이나믹 라우팅 프로토콜(dynamic routing protocol)

  • 라우터가 알아서 routing table을 만들어 준다.
  • 경로 이상 시 알아서 다른 경로를 설정할 수 있다.
  • 하지만 라우터의 부담이 가중된다.
  • RIP, IGRP, OSPF, EIGRP 등이 있다.

내부 network에서 routing 을 담당하느냐에 따라

  • IGP(Interior Gateway Protocol)
  • EGP(Exterior Gateway Protocol) 로 나눌 수 있다.
같은 관리자의 관리 하에 있는 라우터의 집합을 AS(Autonomous System)라고 하는데,
Autonomous System 내에서 사용되는 router 의 protocol 이 IGP이다. RIP, IGRP, EIGRP, OSPF 이 여기에 속한다.
그리고 AS와 다른 AS 사이에서 사용되는 router의 protocol이 EGP이다. BGP, EGP 이 여기에 속한다.


routing table을 어떻게 관리하는 가에 따라

  • 디스턴스 벡터 알고리즘(Distance Vector Algorithm)을 사용하는 프로토콜,
  • 링크 스테이트 알고리즘(Ling State Algorithm)을 사용하는 프로토콜
DVA 는 routing table 에 목적지까지 가는데 필요한 거리와 방향만을 기록. RIP와 IGRP가 대표적이다
LSA 는 라우터가 목적지까지 가는 경로를 SPF(Shortest-Path-First) 알고리즘이란 것을 통해 routing table에 기록. OSPF가 대표적이다.



[컴][자바] java 의 G1 collector 1/2

자바 / 가비지 컬렉터 /

  1. 쿠…sal: [컴][자바] java 의 G1 collector
  2. 쿠…sal: [컴][java] G1 Garbage Collector 2/2

G1 Garbage Collector 1/2

  • server-style garbage collector
  • multi-processor machines 를 target 으로 한다.
  • 높은 처리량(througput)을 달성하면서 높은 확률로 garbage collection pause time 목표를 충족시키다.
  • Oracle JDK 7 update 4 부터 지원시작
  • 다음과 같은 어플리케이션을 위해 디자인 됐다.
    • CMS collector 와 같은 응용 프로그램 스레드와 동시에 작동 하는 application.
    • pause time 을 유발하는 긴 GC가 없이 여유 공간을 compact 하는 application
    • 더 예측 가능한 GC pause durations가 필요한 application
    • 많은 throughput performance 를 희생하고 싶지 않은 application.
    • 훨씬 더 큰 Java 힙이 필요하지 않는 application.

G1은 CMS (Concurrent Mark-Sweep Collector)의 장기 교체 계획이다.

G1과 CMS를 비교해서, G1의 더 나은 점은

  • G1이 compacting collector
    • G1 은 충분히 압축한다
      • allocation을 위한 fine-grained free list 들의 사용을 완전하게 피하고, 대신에 region 들에 의존하기 위해서 --> 연속된 메모리로 옮겨놓는 것, 이로 인해 분산되어있는 것들에 대한 접근을위해 리스트를 traverse 해야 하지만, 한곳에 모아놓으면 traverse time 을 줄이는 것 같다.
      • 이는 collector의 일부를 상당히 단순화하고 잠재적인 fragmentation 문제를 대부분 제거한다
  • 또한 G1은 CMS collector 보다 좀 더 예측 가능한 garbage collection pauses를 제공하며 사용자가 원하는 desired pause 목표를 지정할 수 있다.

G1 동작 overview

오래된 garbage collectors (직렬, 병렬, CMS)는 모두 heap을 fixed memory size의

  • young generation
  • old generation
  • permanent generation

의 세 섹션으로 구성한다.

모든 메모리 객체는 이 세 섹션 중 하나에 들어간다.

G1 collector는 다른 접근 방식을 취한다.

heap은 equal-sized heap regions 의 집합으로 나뉜다. 각각의 region은 virtual memroy 의 연속된 범위이다.

heap  ---> heap region
      |
      +---> heap region
      |
      +---> heap region

특정 region 집합에는 이전 collector와 동일한 역할 (eden, survivor, old)이 할당되지만 정의된 fixed size 는 없다. 이것이 메모리 사용에 있어서 더 큰 유연성을 제공한다.

marking phase

garbage collections 을 수행 할 때 G1은 CMS collector(Concurrent Mark-Sweep Collector)와 유사한 방식으로 작동한다.

G1은 동시 전역 마킹 단계(concurrent global marking phase)를 수행하여 heap 전체에서 객체의 liveness 를 결정한다.

마크 단계가 완료되면 G1은 어느 region이 많이 비어 있는지 알게 된다. 이 region에서 먼저 collect하여 일반적으로 많은 양의 여유 공간을 생성한다. 이러한 garbage collection 방법이 Garbage-First 라고 불리는 이유이다.

reclaimable heap region

이름에서 알 수 있듯이 G1은 회수 가능한(reclaimable) object들, 즉 garbage로 가득 찬 heap region에 수집 및 압축 활동(collection and compaction activity)을 집중시킨다.

G1은 pause prediction model(정지 예측 모델)을 사용하여 user-defined pause time target(유저가 정의한 정지 시간 목표)를 충족시키고 지정된 pause time target를 기반해서 "수집 할 영역(region)의 수"를 선택합니다.

evacuation

G1 이 reclamation 을 할 만큼 오래(ripe)됐다고 판단한 region은 evacuation(방출) 을 사용하여 garbage collect 가 된다.

G1은 "힙의 하나 이상의 region"에서 "힙의 단일 region"으로 객체를 복사하고 프로세스에서 둘 영역 모두의 메모리를 압축하고 해제한다. --> 여러개로 흩어진 region 을 하나의 연속된 공간으로 모으고, 이것을 하나의 region 으로 처리한다?

이러한 evacuation은 multi processors 에서 병렬로 수행되어 pause times을 줄이고 처리량을 증가시킨다.

따라서 G1은 각각의 garbage collection에서 지속적으로 동작하여 단편화를 줄이고 user-defined pause times 내에서 작업한다.

이것은 이전의 두 가지 방법으로는 불가능하다. CMS (Concurrent Mark Sweep) garbage collector 는 압축(compact)을 수행하지 않는다. ParallelOld garbage collection은 전체 힙 압축(whole-heap compaction) 만 수행하므로 상당한 pause times이 발생한다.

G1은 real-time collector가 아니다. 즉, real-time os 처럼 time critical 하지 않다. 높은 확률로 pause time target를 충족하지만, 절대적으로 확신할 수 있는 것은 아니다.

이전 collection 의 데이터를 기반으로 G1은 사용자가 지정한 target time 내에 collect 할 수있는 "region의 수"를 추정한다.

따라서 collector 는 region을 수집하는 비용에 대해 reasonably accurate model(합리적으로 정확한 모델)을 갖고있고, 이 모델을 사용하여 pause time target 내에 어느 region 을 collect 할지 얼마나 많은 region 을 collect 할 지를 결정한다.

참고 : G1에는 concurrent (애플리케이션 스레드와 함께 실행 (예 : refinement, marking, cleanup))와 parallel (멀티 스레드, 예를 들어 stop-the-world) 단계가 있다. full garbage collection은 여전히 ​​단일 스레드이지만, 잘 tuning 하면 애플리케이션이 full GC를 피할 수 있다.

G1 발자국

ParallelOldGC 또는 CMS collector에서 G1으로 마이그레이션하면 JVM 프로세스 크기더 커질 수 있다. 이것은 Remembered Sets 및 Collection Sets과 같은 "accounting" data structures 때문이다.

RSets

  • Remembered Sets(RSets)는 특정 region 에 대한 obejct referece 들을 추적한다.
  • heap에는 region 당 하나의 RSet이 있다.
  • RSet을 사용해서 region의 병렬 및 독립 collection이 가능하게 한다.
  • RSets의 전체 foot printing 영향은 5 % 미만이다.

CSets

  • Collection Sets(CSets) GC에서 collect 될 region 들의 집합.
  • CSet의 모든 라이브 데이터는 GC 중에 evacuated 된다.(copied / moved).
  • regions 의 집합은 Eden, survivor 및 / 또는 old generation 이 될 수 있다.
  • CSets는 JVM 크기에 1 % 미만의 영향을 미친다.

G1의 권장 사용 사례

G1의 첫 번째 초점은 limited GC latency time큰 heap이 필요한 애플리케이션을 실행하는 사용자에게 솔루션을 제공하는 것이다.

약 6GB 이상의 힙 크기와 0.5 초 미만의 안정적이고 예측 가능한 pause time 을 의미한다.

CMS 또는 ParallelOldGC garbage collector로 실행중인 응용 프로그램 중 G1로 전환하는 것이 좋은 경우(다음중 하나에 해당하면 G1 을 사용하는 것이 좋다.)

  • Full GC duration이 너무 길거나 너무 자주 일어난다.
  • object allocation rate 의 비율 또는 object promotion 비율이 크게 다르다.
  • 원하지 않는 긴 garbage collection 또는 compaction pauses (0.5-1 초 이상)

참고 :

  • CMS 또는 ParallelOldGC를 사용하고 있고 응용 프로그램에 garbage collection pauses가 길지 않으면 현재 collector를 유지하는 것이 좋다.
  • 최신 JDK를 사용해도 G1 collector 를 꼭 사용하지 않아도 된다.

See Also

  1. JEP 345: NUMA-Aware Memory Allocation for G1
  2. 마지막 남은 공짜 점심. Facebook의 메모리 할당자 jemalloc | kth 개발자 블로그

Reference

  1. Getting Started with the G1 Garbage Collector

[컴][네트워크] DDos(distributed denial of service) 공격

DDOS attack / 디도스 / ddos / distributed denial of service

DDos(distributed denial of service) 공격

디도스 공격의 목적

  • 대상(온라인 리소스)을 느리게 만든다.
  • 대상을 응답이 없게 만든다.

3가지 유형의 디도스 공격

  1. 볼륨 기반 공격
    • 대량의 가짜 트래픽을 이용
    • 웹 사이트나 서버 등의 리소스의 용량을 초과한다.
    • 여기에는 ICMP, UDP, SPF(Spoofed-Packet Flood) 공격 등이 포함
    • 측정: 초당 비트 수(Bits Per Second, BPS)로 측정.
  2. 특정 layer 를 공격
    1. 프로토콜 또는 네트워크 layer 디도스 공격
      • 다수의 패킷을 표적화된 네트워크 인프라인프라 관리 툴로 전송
      • 공격 방법
        • SYN 플러드
        • 스머프 디도스 등
      • 측정: 초당 패킷 수(Packets Per Second, PPS)로 측정.
    2. 애플리케이션 layer 공격
      • 애플리케이션에 악의적인 요청을 무작위로 전송하여 수행.
      • 측정: 초당 요구 수(Requests Per Second, RPS)로 측정.

대규모 공격 예

  • 2016년 10월, 인터넷 인프라 서비스 제공 기업인 딘 DNS(현 오라클DYN)
    • DNS 쿼리를 수천만 개의 IP 주소로부터 받았다.
    • 이로 인해 시스템이 마비됐다.
    • 이 공격은 미라이 봇넷을 통해 수행됐다.
    • IP 카메라와 프린터를 포함하여 10만 개 이상의 IoT 기기를 감염시킨 것으로 보도
    • 최고조일 때 미라이는 40만 개의 봇에 달했다.
    • 아마존, 넷플릭스, 레딧, 스포티파이, 텀블러, 트위터 등의 서비스가 마비.
  • 2018년 초, 2월 28일, github
    • 초당 1.35TB의 트래픽
    • 기트허브는 간헐적으로 차단
    • 20분 만에 해당 공격을 물리쳤다.
    • 해당 공격에 사용된 기술에 관한 분석
      • MemCached 를 사용하는 서버를 이용.
      • 작은 get 으로 큰 사이즈의 response를 가져다 준다.
      • 요청자의 ip address 를 변경해서 요청하면, 특정 ip address 로 대량의 response 가 가게 된다.

봇넷을 활용한 공격

  • 깃허브 이후, 미국의 한 service provider 에 대한 미라이 봇 공격
    • MemCached 기반 공격
    • 초당 1.7TB 공격
    • 취약한 IoT 기기를 활용.
  • 아카마이, 클라우드플레어, 플래시포인트, 구글, 리스크IQ, 팀 사임루 내부의 보안팀들이 수행한 조사에서 유사한 규모의 와이어X라는 봇넷이 발견
    • 100개국에서 해킹된 10만 개의 안드로이드 기기로 구성
  • 토리
    • 일련의 IoT 기기를 장악할 수 있으며 미라이보다 더욱 일관되고 위험한 것으로 여겨지고 있다.
  • 데몬봇
    • 하둡 클러스터를 장악하여 더 큰 연산 능력을 얻는다.
  • 0x-booter 같은 새로운 디도스 실행 플랫폼의 등장
    • 미라이의 변종인 “부시도(Bushido) 악성코드”에 감염된 약 1만 6,000개의 IoT 기기를 이용

디도스 트렌드

  • 봇넷의 임대
    • 디도스 공격자는 봇넷에 의존
    • 이런 봇넷을 임대해서 사용
  • APDoS(Advanced Persistent Denial-of-Service)
    • 단일 공격 안에서 다수의 공격 벡터를 사용하는 APDoS(Advanced Persistent Denial-of-Service)
    • 포함하는 공격
      • 데이터베이스
      • 애플리케이션
      • 서버에 대한 직접적인 공격 등 애플리케이션 계층이 포함
  • ISP 와 클라우드를 타겟으로
    • 피해자를 직접 표적으로 삼지 않는 대신에 그들이 의존하는 ISP와 클라우드 제공자 등의 조직을 표적으로 삼는 경우가 많다.
    • 자사와 협업하는 여러 비즈니스 파트너, 벤더, 공급자에 대한 공격도 우려

github 의 ddos 공격 자료

References

  1. 디도스 공격은 어떻게 발전하고 있나 - CIO Korea

[컴][통신] windows 에서 특정 program 에 대한 방화벽 설정 방법

V3 Lite 를 설치 후 해야 할일 / 안랩 업데이트 / 통신 라이트 / v3 라이트 차단 / 방화벽 설정 방법 / 방화벽 command  / command line firewall netsh how to set advfirewall /




windows 에서 특정 program 에 대한 방화벽 설정 방법

ASDSvc 의 TCP 통신을 제한

V3 Lite - 나무위키의 이야기는 P2P 로 업데이트 하는 방식을 사용한다고 한다.

그래서 이부분을 조금 제한 하려 한다. 현재로서는 이렇게 했을 때 update 가 될지 안될지 확인을 해보지는 못했다.

대략적인 절차

  • 제어판 --> windows 방화벽 –> 고급설정 
  • --> 아웃바운드 규칙 
  • –> 새규칙 
  • –> 규칙종류, ‘프로그램’
  • –> %ProgramFiles%\AhnLab\V3Lite40\ASDSvc.exe
  • –> 연결차단

CLI command

위처럼 gui 를 통해서 해도 되고, 간단하게 아래 command 를 사용해도 된다. (관리자 권한의 cmd 를 열어야 한다.)

netsh advfirewall firewall add rule name="ASDSvc - my conf" dir=out action=block program="%ProgramFiles%\AhnLab\V3Lite40\ASDSvc.exe" enable=yes profile=ANY


ASDSvc 가 1755 port 도 계속 이용하는 듯 하다. 1755 는 MS-streaming 관련 port 라서 port 자체를 막는 것은 좋지 않아 보인다. 일단 위의 프로그램 관련 통신만 차단해도 ASDSvc 가 1755 에서 통신을 하지는 않는 듯 보인다.

See Also


  1. Port 1755 (tcp/udp) :: SpeedGuide

Reference


  1. How to use the "netsh advfirewall firewall" context instead of the "netsh firewall" context to control Windows Firewall behavior in Windows Server 2008 and in Windows Vista
  2. Netsh AdvFirewall Firewall Commands






[컴] windows cmd 에서 alias 설정

alias 설정 / 단축키 설정 / .bashrc 설정 / 자동으로 설정 / bash function /


windows cmd 에서 alias 설정

regedit 를 이용해서 아래 처럼 설정하면 된다.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"AutoRun"="%USERPROFILE%\\alias.cmd"


위 같이 설정하면, cmd 를 실행할 때마다. %USERPROFILE%\\alias.cmd 를 한번 실행해 주게 된다.

그리고 나서 %UserProfile% 에 alias.cmd 를 아래처럼 작성하면 된다.
@echo off

DOSKEY ls=dir /b
DOSKEY ac=c:\a\envs\$1\Scripts\activate.bat $*
$* : 나머지 모든 parameter


References

  1. alias - Aliases in Windows command prompt - Stack Overflow, 2019-09-30

[컴][웹] firefox 에서 banner_ 로 시작하는 class 이름

파이어폭스 / 광고 / 배너 / 배너이미지 / 광고 이미지 / 광고 차단 방법

Firefox 에서 banner_ class 사용시 주의사항

firefox 를 사용하는데, class name 을 banner_image 로 설정했다. 그랬더니 firefox 에서 보이지 않게 됐다. 그래서 다른 class name (banner 가 들어가지 않은) 으로 변경하였다.
  • 사용한 firefox version : 7.1.0 64 bit

See Also

[컴][웹] AWS 트래픽 줄이는 방법

aws 에서 비용 줄이는 방법 / aws traffic 감소 / 아마존 웹 서비스 트래픽 감소 / 트래픽 줄이는 방법 / 아마존 저렴하게 이용하는 방법 / 감소 방법 / 감소시키는 방법

AWS 트래픽 줄이는 방법

ref. 1 의 gameanaytics 라는 곳에서 자신들이 aws 의 traffic 을 줄인 방법을 소개했다. 여기서는 대략적인 내용만 적으려 한다. 자세한 이야기는 ref. 1을 읽어보도록 하자.
  1. http header 크기 줄이기

    // 줄이기전 header
    HTTP/1.1 200 OK
    Connection: Keep-Alive
    Content-Length: 15
    Content-Type: application/json
    accept-encoding: gzip
    Access-Control-Allow-Origin: *
    X-GA-Service: collect
    Access-Control-Allow-Methods: GET, POST, OPTIONS
    Access-Control-Allow-Headers: Authorization, X-Requested-With, Content-Type, Content-Encoding
    
    // 줄인 후 header
    HTTP/1.1 200 OK
    Connection: Keep-Alive
    Content-Length: 15
    Content-Type: application/json
    

  2. TLS handshake 횟수를 줄이기
    • TLS handshake 에서 가장 큰 크기는 certificate 의 trust chain 이었다.
    • 만약 client 가 2번째 service 에 접속하는 거면, server 에게 이전에 사용한 TLS session 을 요청한다.
    • 그래서 AWS Load balancer 에서 cache size 등을 조절해 보려했지만, 못찾았다.
    • 그래서 close connection 하는 시간을 10분으로 늘렸다.(기본 세팅은 60초)
  3. 인증서(certificate) 의 크기 줄이기
    • 인증서가 TLS handshake 할 때 certificate 교환을 하기에, certificate size 가 작아야 유리.
    • AWS 에서 무료로 제공하는 certificate 에는 trust chain 에는 intermediate certificate 이 3개나 있어서, size 가 더 컸다.
    • root certificate 만 있으면 되기에, Digicert 에서 따로 구매해서 사용했다.

References

  1. Three ways to reduce the costs of your HTTP(S) API on AWS - GameAnalytics, 2019-12-13