[컴][OS] Spinlock, Mutext lock



Spinlock, Mutext lock

Mutex lock 은 os 에서 software 로 lock 을 만들었는데 그중 가장 간단한 도구가 mutex lock 이다.

Mutex lock 을 spinlock 이라고도 부른다. 왜냐하면, process 가 lock 이 available 될 때까지 계속 돌기 때문이다.(spin)

이 spinlock 은 busy waiting 을 만든다. 하지만 반대로 그래서 context switch 가 필요없다.

멀티코어 시스템에서 특정한 경우에는 spinlock 이 훨씬 좋은 선택이 된다.

만약 lock 이 짧은 순간이라면, 다른 thread 는 또다른 core 에서 critical section 을 수행하는 동안 하나의 thread 가 하나의 core 에서 lock 을 기다릴 수 있다.


Spinlock 은 multiprocessor 시스템에서 쓰는 locking mechanism 중 하나이다.
짧은 시간에 lock 을 할 때 사용한다.이 짧은 시간의 정의는

lock 은 2개의context switch 가 필요하다.
1. thread 를 waiting state 로 옮기는 context switch
2. lock 이 가능하게 됐을 때 waiting thread 를 복구 시키는 context switch
일반적인 spinlock 을 사용하는 규칙은 lock 이 2개 미만의 context switch 의 시간동안 lock 을 잡을 때 사용한다.


References


  1. Operating System Concepts 10th edition

[컴][네트워크] 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






[웹][툴] github marketplace 에서 도움이 되는 도구들

도구/ 코드 리뷰 도구 / code analysis / code review / tools /



github marketplace 에서 도움이 되는 도구들

가격정보는 ref. 1 에 있다.

  1. AccessLint 
  2. Imgbot
    1. Imgbot - Automatic image compression
    2. github market place 에서 설치할 수 있는듯 하다. 설치를 하면 내 git repository 에 있는 이미지를 압축해 주는 듯 하다.
  3. LGTM
  4. DeepSource
  5. Codelingo
    1. codelingo · GitHub Marketplace · GitHub
    2. 정의해 놓은 coding rule 에 따라 소스를 확인해준다. lint 같은 툴이다.
  6. DeepScan
  7. CodeScene
  8. FeaturePeek



References


  1. https://featurepeek.com/blog/the-8-best-tools-for-code-review-in-2020/

[웹] 멜로디 관련 프로그래밍

멜로디 프로그래밍 / 프로그래밍으로 음악을 / 소리 / 사운드 관련 / 음악관련 소리 관련 / progrmaming melody / 코딩 /


멜로디 관련 프로그래밍

  1. http://allthemusic.info/
    1. GitHub - allthemusicllc/atm-cli: Command line tool for generating and working with MIDI files. : Rust 로 되어 있다. shell 에서 멜로디를 프로그래밍? 하는 듯 하다.

[컴][웹] AdoniJS 에서 File Upload

아도니스 / 업로드 / 파일 업로드

AdoniJS 에서 file upload

file 의 upload 와 함께, file 이름도 함께 server 로 전달하고 싶었다. 그래서 처음에 client side 의 FormData 에 field 를 하나 더 추가해서 server 로 보냈다.
...
onClickUpload() {
  ...
  // @ref : https://reactjs.org/docs/uncontrolled-components.html#the-file-input-tag
  const file = this.fileInput.current.files[0];
  if (file) {
    const reqData = new FormData(); // eslint-disable-line
    reqData.append('file', file);
    reqData.append('alias', this.state.alias);

    this.props.uploadFile(this.props.url, reqData);
  }
}

render() {
  return (
    <div className="">
      <input type="text" placeholder="alias 별칭" name="alias" onChange={this.onChangeAlias} />
      <input
        type="file"
        className="form-control"
        name={this.props.name}
        ref={this.fileInput}
      />
      <button
        type='button'
        onClick={this.onClickUpload}
        disabled={this.props.uploadStatus === 'WAITING'}
      >
        UPLOAD
      </button>
      <div>
        {this.state.message}
      </div>
    </div>
  );
}
...

문제점

그래서 서버쪽에서는 아래처럼 처리를 하려고 했다. 하지만 문제는 request.multipart.field 로 등록한 callback 과 request.multipart.file 에서 등록한 callback 중 어느 것이 먼저 동작할 지 알 수 없는 것이다. 순서에 대한 보장이 되지 않는다. [ref. 1]



  async uploadEventBanner({ request, response }) {

    let fileUrl, dstPath;
    try {
      // const alias = inputData.alias;
      const bButler = new BannerButler();
      let body = {};
      request.multipart.field((name, value) => {
        // 이것이 request.multipart.file 의 callback 보다 먼저 실행되지 않는다.        
        body[name] = value;
      });

      // 'file' is name attribute of form-data
      request.multipart.file('file', {}, async (file) => {
        dstPath = bButler.getDstPath(file, alias);
        await bButler.upload(file, dstPath);
      });
      await request.multipart.process();

      fileUrl = bButler.getFileUrl(dstPath);
      await bButler.insertEventBannerInfo(alias, inputData.notice_id, fileUrl);

    } catch (e) {
      console.error(e.stack);
      return response.status(400).json({ error: e.message });
    }

    return response.json({ message: 'upload_completed', url: fileUrl });
  }

대안

ref.1 에서 비슷한 경우가 있어서 답변을 보니 다음 2가지 방법으로 처리가 가능할 듯 했다.
  1. alias 를 query string 으로 넘기는 방법 : 이방법이 지금으로서는 최선인 듯 하다.
  2. GB 정도의 사이즈를 다루는 것이 아니라면, upload 를 직접 처리하는 방법: 이것은 아마도 ref. 2 에서 처럼 직접 file 을 다루는 방법을 이야기하는 듯 하다.

See Also

  1. HTTP Tests

Reference

  1. How to get request values with processManually · Issue #1092 · adonisjs/core · GitHub
  2. File Uploads

[컴][OS] 리눅스 부팅과정

linux boot process / 리눅스 부팅 절차 / 부팅 순서 / 부팅 되는 법 /


리눅스 boot process

  • 리눅스 커널 이미지 (Linux kernel image) 는 압축된 file 이다. 그래서 이것은 memory 로 load 된 이후에 압축을 풀게 된다.
  • boot process 동안에, boot loader 는 일반적으로 initramfs 라 불리는 임시 RAM file system 을 만든다.
  • 이 파일시스템에는 "실제 root file system"(이것은 main memory 에 없다.) 을 지원하기 위해 설치되어야만 하는 드라이버들커널모듈들을 포함하고 있다.
  • 커널이 시작되고, 필요한 드라이버들이 설치되자마자, 커널은 root file system 의 위치를 임시 RAM 에서 적절한 root file system 위치로 옮긴다.
  • 마지막으로 리눅스는 systemd process 를 생성한다. systemd process 가 system 에서 최초의 process 이다.
  • 그리고 나서 다른 서비스들을 시작한다.(웹서버, db 같은..)
  • 최종적으로 system 은 login prompt 를 보여준다.

Android

  • linux 에서 일반적으로 쓰이는 boot loader 인 GRUB 대신에 boot loadervendors 가 알아서 제작한다.
  • 가장 일반적인 안드로이드 boot loader 는 LK(little kernel) 이다.
  • 안드로이드에서도 압축된 kernel image 를 이용하고, initramfs 를 이용한다.
  • 안드로이드는 initramfs 를 device 의 root file system 으로 이용한다. 하지만, Linux 에서는 모든 필요한 driver 들이 loaded 되고 나서 initramfs 를 버린다.
  • kernel 이 load 되고, root file system 이 mounted 되면,
  • Android 는 init process 를 시작하고, 여러개의 service 들을 실행한다.

대부분의 boot loader 들은 recovery mode, 또는 single-user mode 등으로 booting 을 제공해준다.(windows 안전모드 같은)

See Also

  1. [컴][폰] 안드로이드 부팅과정
  2. [컴] BIOS 동작

Reference

  1. Operating System Concepts 10th edition