ymawky - ARM64 어셈블리로 직접 만든 웹 서버

5 hours ago 1
  • ymawky는 ARM64 어셈블리만으로 작성된 정적 파일 웹 서버로, libc 없이 syscall만 사용하고 연결마다 fork하는 구조로 동작함
  • 개발 대상은 MacOS이며 실행은 Apple silicon arm64에서만 가능하고, 빌드에는 Xcode Command Line Tools와 make가 필요함
  • 기본 실행은 127.0.0.1:8080에서 시작하며 포트 지정은 가능하지만, 현재 사용자 지정 주소는 지원하지 않고 127.0.0.1에서만 동작함
  • 문서 루트는 기본적으로 www/이며 GET /는 www/index.html을 찾고, 오류 페이지는 err/(code).html에서 제공하도록 구성됨
  • 지원 HTTP 메서드는 GET, PUT, DELETE, OPTIONS, HEAD이며, 서버 측 코드 실행이나 /search?query=term 같은 고급 URL 파싱은 지원하지 않음
  • PUT은 최대 1GiB 업로드를 기본 지원하고, 임시 파일 www/.ymawky_tmp_<pid>에 쓴 뒤 rename하는 방식으로 부분 업로드가 기존 파일을 덮어쓰지 않게 함
  • GET은 Range: bytes= 요청을 지원해 bytes=X-N, bytes=-N, bytes=X- 형식을 처리하며, 비디오 탐색도 잘 지원한다고 되어 있음
  • 파일 확장자를 기반으로 MIME 타입을 감지해 Content-Type 응답 헤더를 보내며, 웹 파일·이미지·폰트·문서·비디오·오디오·압축 파일 확장자를 다수 인식함
  • 경로 안전장치로 PATH_MAX 이상 경로 거부, .. 기반 경로 탈출 차단, 모든 요청 경로에 www/ 접두, O_NOFOLLOW_ANY로 symlink 포함 경로 거부를 적용함
  • slowloris류 DoS 완화를 위해 읽기 사이가 10초를 넘거나 전체 헤더 수신이 10초를 넘으면 연결을 닫고 408 Request Timeout을 반환함
  • HTTP/1.1 요청은 Host: 헤더가 필요하며, Host 값을 실제로 사용하지는 않지만 RFC 9112 Section 3.2에 따라 헤더 존재를 요구함
  • config.S에서 문서 루트, 오류 페이지 디렉터리, 기본 파일, 수신 타임아웃, PUT 속도·크기 제한, 최대 동시 프로세스 수 등을 조정할 수 있음
  • Linux나 다른 Unix로 이식하려면 syscall 호출 레지스터와 svc, 오류 반환 방식, fork(), SO_NOSIGPIPE, O_NOFOLLOW_ANY, renameatx_np(), 구조체 레이아웃, Mach-O 재배치 문법, signal handling 등을 수정해야 함
Read Entire Article