2021. 07. 04., 서울 성동구 성수동1가 678-1.

침습에 꽃이 피더라도 강우를 소망하지는 않기로 해요

2024. 07. 08., 부산 사상구.

본가에서 잠옷으로 입었던 티셔츠를 스리슬쩍 나의 짐으로 챙겼습니다. 곰돌이가 그려진 감자튀김 티셔츠라니 너무 귀엽지 않나요. 엄마는 저게 도대체 어떤 구석이 마음에 든다는 것인지 이해할 수 없다는 표정으로 나를 쳐다보았습니다. 사실 지금 짐을 챙기고 싶지는 않았어요. 본가에 며칠 더 있고 싶었습니다. 그런다고 나의 혼잡한 마음이 더 나아지지는 않겠지만.

포항으로 가는 버스 앞에서 한 외국인이 나에게 포항으로 가는 버스가 맞냐고 물어봤습니다. 나는 자신이 없었지만 그렇다고 대답했습니다. 포항으로 돌아갈 자신이 없었어요. 이 끔찍한 동네에 발을 들일 자신이 없었습니다.

2024. 07. 08., 부산 사상구 삼락동 29-84.

버스에서 맥북을 펼치고 글을 쓰려고 했습니다만 그러지 못했습니다. 부르고 싶지 않았던 노래를 간단히 인용해서 글을 마무리했습니다.

헤일리에게 메시지가 왔습니다. 혼자 생각하기에 너무 힘들고 지치면 함께 해줄 수 있다는 내용이었어요. 비록 지금은 무알콜 밖에 마시지 못하지만. 승낙하지 않을 이유를 찾을 수 없었습니다.

2024. 07. 08., 경북 포항시 남구.

학교에서 헤일리를 만나 함께 버스를 타고 출발했습니다. 걸어가기에는 비가 우리를 방해했습니다만 타코야끼 16알과 술 몇 병을 사지 못하게 할 정도는 아니었습니다. 오래간만에 먹은 밀가루 반죽은 너무나도 감동적이어서 눈물이 나기에 꽤나 충분한 맛을 선사해주었습니다.

정신을 차려보니 우리는 레이디 가가의 무대 영상들을 돌려보고 있었고 나는 방으로 돌아갈 때가 되었음을 직감했습니다.

쏟아지는 비 사이를 비집는 연속적인 천둥과 번개에 나는 겁에 질려 핫보이에게 전화를 걸었고 후회할 말들을 내뱉었다는 것은 내일의 내가 깨달았습니다.

영뚝에게 온 메시지에 잠에서 깼습니다. — 잠에서 깼다는 표현보다 침대에서 일어났다는 말이 더 맞는 표현이겠습니다. 포항이래요. 나한테 말도 하지 않고 포항에 방문하다니 충분한 귀책사유이지 않나요. 쩡원과 와장의 연구실에서 주최한 연합 워크샵에 따라왔다는 말과 함께 일정표를 건네주었고 나는 새벽 1시는 너무 늦겠다는 말을 남겼습니다. 괜찮겠다는 회신이 도착했고 나는 약간의 기대를 안고 하루를 시작할 수 있었습니다.

샤워를 하면서 미팅을 준비했습니다. 그동안 팽팽 놀다가 왜 3시 미팅을 앞두고 나갈 준비를 하면서 미팅을 준비하냐고 묻는다면 할 답변은 정해져있습니다. 나는 원래 그런 사람입니다. 따뜻한 물에 생각의 관절이 풀어지면 그때 비로소 회로가 원활해집니다. 따로 자료를 준비할 필요가 없는 미팅이기도 했고요.

기존 프로젝트가 거의 막바지에 들어섬에 따라서 나는 꽤나 여유를 느끼고 있었습니다. 교수님께서 나의 여유를 파악하셨는지 이제 진짜로 연구를 시작하자고 제안했어요. 프로젝트를 하느라 미뤄둔 주제를 지금 읽고 있는 페이퍼와 함께 꺼내왔습니다. 30분이 넘는 토론 끝에 처음 주제는 꽤나 다른 모습으로 변해있었습니다. 우리는 그 모습이 꽤나 마음에 들었습니다.

오래간만에 포준위 홍보팀장을 만났습니다. 미궁 진행상황과 관련한 미팅이었는데 딱히 나눌 논의사항이 없음을 직감하고 있었어요. 예상대로 미팅은 15분 정도에서 마무리되었습니다. 아쉬운 탓에 커피챗을 제안했고 나는 얼떨결에 진로 고민에 함께 탑승하게 되었어요. 아직 석사 1년차인 내가 할 이야기들은 아니었는데 미안합니다.

2024. 07. 09., 경북 포항시 남구 청암로 77.

8시 반에 약속이 있었습니다만 9시로 미뤄졌고 실제로 만나게 된 것은 9시 15분이었습니다. 늦어진 탓에 술이나 마시자는 이야기가 나왔고 멀리 나가기는 싫어서 —어제 헤일리와 가지 못한— 통나무집에 방문했습니다. 생각보다 많은 이야기를 나눴습니다만 자세하게 기억이 나지는 않는 탓에 다음에 한번 더 볼 것을 약속했습니다.

”지금 와야할 것 같은 분위기야.” 영뚝에게 메시지가 왔습니다. 현이를 데려다주고 콜로세움으로 향했어요. 이런 남의 집 행사에 와도 되는건가라는 생각을 술기운을 빌려 떨쳐냈습니다. 카이스트 교수님께 내 연구 분야를 소개해야 할 때가 되었을 때가 되어서야 떨쳐낸 생각이 다시 와서 달라붙었습니다.

무기력함에 눈을 끔벅이다 생긴 조그마한 결심을 붙잡았고 꽤나 어렵게 침대에서 벗어날 수 있었습니다. 어제 교수님과 함께 잡은 새로운 주제가 썩 마음에 들었어요. 그동안 같은 프로젝트를 오래 진행하면서 꽤나 질려있는 상태였기에 오래간만에 생기를 가질 수 있었습니다.

그럼에도 한 구석은 무기력했기에 아무 옷이나 걸쳐 입고 기숙사 현관을 나서는 순간 헤일리에게 전화가 왔습니다. 오늘 저녁에 셋이서 막창을 먹자는 제안이었어요. 나는 옷을 갈아입고 다시 기숙사 현관을 나섰습니다.

나는 살면서 퍼저를 사용할 일이 있을 거라고는 전혀 예상하지 못했습니다. 내 연구 분야와는 상당히 거리가 멀었으니까요. 그런데 정신을 차려보니, 나는 파이썬 함수에 대해 property-based 퍼징을 할 방법을 찾고 있더군요. 처음에는 나이브하게 바이트코드 레벨에서 비트맵으로 퍼징이 가능할 줄 알았어요. 하지만 몇 번 검색 끝에 불가능한 방법임을 깨달을 수 있었습니다.

여러 시도 끝에 protocol buffers를 퍼징을 위한 intermediate format으로 사용하는 것이 가장 유망하겠다는 생각이 들었습니다. 미친 생각이 떠올랐어요. 파이썬 함수의 타입 힌트를 protocol buffers 정의로 바꿔주는 컴파일러를 짜보자고. 구현은 꽤나 빠르게 이루어졌습니다만 잠시 중단할 수 밖에 없었습니다. 막창을 먹기 위해서.

2024. 07. 10., 경북 포항시 남구 형산강북로 77 1층.

나는 분명 셋이서 보자는 제안에 수락한 것이지, 일곱 명이서 보자는 제안에 수락하지는 않았는데요. 모여보니 방송국 18학번 6명의 모임에 내가 끼어 있는 상황이 되었습니다. 우리막창에 방문했어요. 저번에 방문했다가 사장님이 꽤나 부담스럽게 말을 건 이후로는 처음이었습니다. 막창은 맛있었지만, 이 조합에 술을 주문하지 않다니 이 사람들도 이제 정말 학부생이 아니구나 하는 생각이 들었습니다.

끝으로 요신의 하루에 방문해서 이야기만 하다가 헤어지는 것으로 건전함의 정점을 찍었습니다. 모여서 각자 콘텐츠를 소비하는 모습이 인상적이었지만, 그중에서도 그림을 그리며 노는 헤일리의 모습이 가장 눈에 띄었습니다.

학교로 돌아와서는 구현을 마무리했어요. 사실 막창을 먹는 내내 어떻게 구현해야할지 그 생각만 하고 있었어요. 미안합니다. 컴파일러는 생각보다 잘 작동했습니다. Definition을 파이썬 런타임에 올려서 atheris와 통합하는 작업까지 마무리했고 나는 오래간만에 성취감을 느낄 수 있었습니다.

스터디 세션 덕분에 오랜만에 출근했습니다. 이번 세션은 내가 준비하는 차례였고, 나는 함께 실습을 하기 위해 Jupyter Notebook 형식으로 자료를 준비했어요. 마크다운으로 작성한 내용 사이사이에 실습을 위한 셀을 테스트 함수와 함께 끼워 넣었습니다. 스터디를 하면서 함께 테스트를 통과할 수 있는 코드를 작성하면 재밌겠다는 생각이 들었었거든요. 하지만 각 실습에 생각보다 많은 시간이 걸리게 되었고, 끝에는 결국 혼자 코딩을 하는 식으로 마무리되었습니다. 준비한 것에 비해 아쉬운 마무리였어요.

티타로 출근해서 리팩토링을 감행했습니다. 지금은 파이썬만 지원하도록 구현되어 있는데, 교수님이 언젠가 먼 미래에 꼭 다른 언어에 대해서도 실험할 수 있으면 좋겠다는 이야기를 할 것 같다는 직감이 들었어요. 대비하기 위해 코드를 비틀었습니다. Dependency injection이 가능한 프레임워크 형태로 아키텍처를 바꿔서 확장에 대응할 수 있도록 변형했죠.

다음으로는 tree-shaking을 구현해야 할 필요가 있었습니다. 외부 코드에서 함수 하나만 선택하고 그 함수를 구현하는 데 필요한 부분만 남겨서 protobuf 컴파일러에 넣고 싶었거든요. 하지만 수많은 검색을 통해 불가능을 맛보았고, GPT-4의 한도를 초과할 때가 되어서야 파이썬의 언어 규격으로는 불가능하다는 사실을 인정했습니다. 문제를 약간 완화했습니다. Tree shaking을 통해 코드를 얻는 대신 코드에서 third-party를 모두 제거하고 그 코드에서 함수들을 추출하기로 했죠. 각 노드를 visit하면서 scope를 고려해야 하는 탓에 구현이 생각보다 까다로웠지만, GPT의 도움을 받아 끝끝내 완성해냈습니다.

2024. 07. 11., 경북 포항시 남구 효자동길10번길 25 2층.

꽤나 많은 열량을 소비했음에도 불구하고, 나는 샐러드를 저녁으로 섭취했고 현이에게 칭찬을 받을 수 있었습니다. 소 잃고 외양간 고치는 중이라고 답변했습니다.

자다가 깼습니다. 샌드박싱을 해야 하겠다는 생각이 들었어요. 퍼징을 할 때 필연적으로 신뢰하지 못하는 코드를 실행하게 될 텐데 이것 때문에 나의 실험 파이프라인이 망쳐지지 않기를 원했습니다.

샤워를 할 때부터 에스크아웃에 도착할 때 까지 나의 머리는 여러 구현 방향들 중에서 어떤 디시전을 내려야할지 결정하지 못한 상태로 혼잡했습니다. 카페에 앉아서 숨을 가다듬고 구현을 시작했어요. 여러 고심 끝에 첫번째로 시도한 것은 Docker Python SDK를 이용해서 컨테이너와 상호작용 하는 것이었습니다. 필요에 따라서 임시 컨테이너를 생성해서 실행하고 삭제하는 방식이었어요. 적절한 Wrapping을 통해서 PoC를 구현했고 기존에 작성한 유닛 테스트들이 모두 통과하는 것도 확인할 수 있었습니다.

2024. 07. 12., 경북 포항시 남구 효자동길6번길 25-1 1층.

급한 불을 껐다고 생각하며 베라보에서 식사를 했습니다. 사실 베라보의 이번 특선을 크게 기대하지는 않았어요. 지금까지 선보인 특선들에 비하면 비교적 평범한 구석이 있다고 생각했는데 국물을 한 입 먹고 그 생각은 없어졌습니다. 평소보다 감칠맛이 훨씬 뛰어난 국물에 나는 밥을 한번 더 추가할 수 밖에 없었고 사장님께서는 나에게 다이어트를 그만 둔 것이냐며 농담을 던졌습니다. 지금처럼 살짝 찐 모습이 보기 좋다고 해주셨는데 나는 그렇게 생각하지 않아요.

식사를 마치고 나서는 길에 사장님은 나에게 블로그 글 또 언제 올라오냐고 물어보셨고 나는 약간 부끄러워졌습니다.

학교로 돌아가는 길에 나는 내 코드가 미워졌습니다. Docker SDK를 통해 샌드박싱을 하는 이상, 타겟 코드가 문자열 형태로 코드에 박힐 필요가 있었고, 이는 개발자로서 나를 불안하게 만들기에 충분했습니다. 여러 생각을 거친 끝에 Celery를 사용하기로 결심했습니다. Celery 워커를 컨테이너에 넣어두고 정책을 통해 워커를 계속 다시 실행하도록 만들면 비슷한 효과를 낼 것이라는 기대가 있었습니다. 사실 애초에 완전한 샌드박싱을 원한 것이 아니었습니다. 실험 파이프라인이 터지지만 않기를 바랐죠.

동아리방에 도착하자마자 나는 오늘 생성한 두 개의 커밋을 되돌렸습니다. Celery를 이용하도록 코드를 바꾸는 데는 큰 힘이 들지 않았지만, pytest와 통합하는 데에는 꽤나 많은 노력이 필요했습니다.

HITCON을 뛰었습니다. 사실 처음에는 크게 생각이 없었어요. 어제 하던 코딩이나 마무리하고 싶었거든요. 하지만 동아리방에서 열심히 HITCON을 뛰고 있는 부우를 보니 약간 마음이 동했습니다.

처음으로 살펴본 문제는 truth of npm이었습니다. 여러 웹 문제들의 코드를 살펴보았는데 await import(...)을 남발하길래 쉬운 문제인 줄 알고 바로 붙잡았죠. /readflag를 실행하는 것이 목표였지만 --allow-run 옵션이 걸려있지 않았고, 나는 절망했습니다. 혹시나 Deno 런타임에서 npm 모듈을 import할 때 특이하게 동작하는 사항이 있는지 확인하기 위해 Deno 소스코드를 확인해보았지만, 결국 Deno가 러스트로 작성되었다는 사실만 확인할 수 있었습니다. 2022년 Dice CTF 문제처럼 RW 권한을 이용해서 RCE까지 연결짓는 문제일 수 있겠다는 생각이 들었고, 나는 당장에 도망쳤습니다.

그다음으로는 Gleamering Star를 살펴봤습니다. 몇 달 전에 컬그가 플러스 디스코드 서버에서 Gleam이라는 언어를 소개해줬는데, 이게 CTF 문제로 나올 줄은 몰랐죠. 처음 보는 생소한 언어였지만 읽는 데는 크게 문제가 없었습니다. 읽는 데 문제가 없었다고 해서 버그를 찾기가 쉽다는 이야기는 아니에요. 처음 보는 생소한 언어나 라이브러리를 가져와서 간단한 버그를 숨겨두고 찾으라고 하는 문제들, 정말 규탄해야 합니다. 정말로.

의욕을 잃고 퇴근하려는 찰나에 부우가 한 문제를 같이 보자고 설득했고, 우리는 imagikatragicka에 갇히게 되었습니다. 기존에 있던 Imagick RCE 버그들을 이용하는 것으로 생각했지만, 실상은 제로데이였고, 이번 달에 공개된 CVE를 몇 개 시도해보다가 도망쳤습니다.

새벽 4시에 방에 돌아온 것에 비해서는 아침 일찍 눈을 떴고 이번주에는 꼭 일기를 써야겠다는 생각에 다시 잠에 들지는 않았습니다.

테라로사에 방문했습니다. 그동안 작성한 글은 거의 모두 테라로사에서 작성했습니다만 오늘은 방문했음에도 불구하고 테라로사에서 작성하지는 못했습니다. 오늘은 아무도 만나지 않을 것을 예상했습니다. 제대로 멀리지 않은 머리에 빨래를 잘못해서 쉰내가 약간 나는 옷을 골라 입었습니다. 하지만 뜻밖에 현이가 테라로사에 찾아왔고 나는 약간 부끄러워졌습니다.

2024. 07. 14., 경북 포항시 남구 효자동길10번길 33 1층.

글을 쓸 수도 있었습니다만 이야기를 나누는 것을 선택했고 그 편이 더 재밌을 것이라고 에상했습니다. 함께 저녁을 먹었고 내가 메뉴를 잘못 고른 것 같아서 미안해졌습니다.

침습에 꽃이 피더라도 강우를 소망하지는 않기로 해요

흐린 하늘임에도 의미를 잃어버린 우산 너머로 들꽃들을 발견할 수 있었습니다. 침습에 무성해진 들판 사이로 어제 보지 못했던 파랑이 일었고 나는 유영을 설득당했습니다. 강우의 소망을 따라 꽃이 피는 것이라면 기상은 그 뜻을 막지 않기를. 그럼에도 강우를 소망하지는 않을 것입니다.


권민재

WWW 사이버디지탈 COM