다양한 공격자들에 의해 사용되는 SystemBC 악성코드

SystemBC는 수년 전부터 다양한 공격자들에 의해 사용되고 있는 Proxy 악성코드이다. 최근에는 SmokeLoader나 Emotet을 통해 유포되고 있는 것이 확인되지만, 과거부터 꾸준히 여러 랜섬웨어 공격에서 사용된 사례들이 존재한다. 공격자가 악의적인 목적으로 특정 주소에 접근하려고 할 때, 감염된 시스템에서 Proxy Bot으로 동작하는 SystemBC를 활용할 경우 해당 시스템을 통로로서 활용할 수 있다. 이외에도 외부에서 추가 악성코드를 설치할 수 있는 다운로더 기능이 존재하기 때문에, 공격자는 추가 페이로드를 설치하는 수단으로서도 SystemBC를 활용 가능하다.


과거 유포 사례

SystemBC는 2019년 RIG 익스플로잇 킷과 Fallout 익스플로잇 킷을 통해 유포되었던 사례가 최초로 확인되었다.[1] 2019년경에 확인되는 초기 버전의 SystemBC는 Socks5 Proxy 기능 위주로 구현되어 작은 사이즈를 갖는 악성코드였으며, SystemBC를 최초로 확인한 ProofPoint에 따르면 개발자는 “socks5 backconnect system”이라는 이름으로 해당 악성코드를 판매했던 이력이 있다.

2020년경에 확인된 SystemBC는 Ryuk 랜섬웨어나 Egregor 랜섬웨어 공격에 함께 사용되었으며, 2021년에는 미국 송유관 업체인 콜로니얼 파이프라인 사를 공격한 DarkSide 랜섬웨어 그룹에서도 사용된 이력이 있다.[2] 익스플로잇 킷이나 웹 브라우저, 스팸 메일 등을 통해 유포되는 랜섬웨어 악성코드들과 달리 이러한 랜섬웨어의 공격자들은 기업 환경의 시스템을 장악한 후에 랜섬웨어를 설치하여 금전을 요구하는 방식으로 공격한다. 즉 최초 침투 이후 코발트 스트라이크와 같은 도구들을 이용해 내부망을 장악한 후 랜섬웨어를 설치하여 기업 내 다수의 시스템들을 랜섬웨어에 감염시키는 방식이다.

공격 과정에서 SystemBC의 역할이 구체적으로 알려져 있지는 않지만 Proxy 기능과 추가 페이로드를 다운로드해 설치할 수 있는 기능을 갖기 때문에 악성 페이로드를 다운로드해 실행하거나 내부 네트워크에 설치되어 Proxy 역할을 담당했을 수 있다. 실제 SystemBC를 이용한 공격 사례가 확인된 F-Secure[3]의 보고서에 따르면 측면 이동 공격을 위해 PsExec 및 스크립트를 다운로드하고 실행하는데 사용되었다.



최근 유포 사례

2022년 3월에는 Emotet에 의해 추가 페이로드로서 설치되고 있는 것이 확인되었다. Emotet은 뱅킹 악성코드로서 감염 시스템에서 정보 탈취를 위한 추가적인 모듈이나 또 다른 악성코드를 설치한다. 일반적으로 공격자들은 감염 시스템을 장악하기 위해 Emotet을 이용해 코발트 스트라이크를 설치하고 있지만, 최근에는 코발트 스트라이크 외에 SystemBC가 유포되고 있는 것이 확인된 것이다.

자사 ASD 인프라에 따르면 최근 확인되고 있는 SystemBC는 대부분 SmokeLoader 악성코드에 의해 설치되고 있다. SmokeLoader는 현재 실행 중인 탐색기 프로세스 즉 explorer.exe에 인젝션 되어 동작하며, 추가 모듈이나 추가 악성코드를 설치할 수 있다. 다음은 SmokeLoader가 인젝션 된 탐색기 프로세스가 SystemBC 악성코드를 설치한 로그이다.

[그림 1] SmokeLoader에 의해 설치되는 SystemBC

최근 SmokeLoader는 상용 소프트웨어의 크랙, 시리얼 다운로드 페이지로 위장한 악성 사이트에서 유포되는 NSIS 드로퍼 악성코드인 Muldrop의해 설치되고 있다. 참고로 이러한 위장 크랙, 시리얼 다운로드 페이지에서 유포되는 악성코드들로는 Muldrop 외에도 CryptBot, PseudoManuscrypt 사례가 존재한다.



SystemBC 분석

SystemBC는 다양한 변종들이 있는데 구체적인 순서는 확인되지 않지만 추가 기능에 따라 몇 개의 변종이 존재한다. Type 2 형태는 자신을 업데이트하는 기능만 존재했던 초기 버전인 Type 1과 달리 Batch, VBS, PowerShell과 같은 스크립트를 다운로드해 실행시키는 기능과 DLL 및 쉘코드 형태의 악성코드를 다운로드해 메모리 상에서 실행시키는 기능이 존재한다. 이외에도 Tor 네트워크를 통해 C&C 서버와 통신하는 기능이 있다.[4] 두 번째 변종인 Type 3은 Type 2과 비교해서 몇 개의 기능이 빠져있는데, Tor 네트워크를 이용하는 부분과 DLL 및 쉘코드를 다운로드해 실행하는 기능이 그것이다.

여기에서는 현재 C&C 서버와의 통신이 가능한 SystemBC를 분석 대상으로 한다. 구체적으로는 Type 1과 Type 3의 기능 대부분이 포함된 Type 2이다. 해당 악성코드는 RedLine을 통해 설치된 이력이 확인되며 SmokeLoader를 통해 유포되는 유형과 동일한 패커로 패킹되어 있다. 참고로 Emotet에 의해 설치되고 있는 것으로 알려진 SystemBC는 Type 3이다.


초기 루틴

SystemBC가 처음 실행되면 인자가 “start”인지를 검사한다. 처음 실행되는 경우에는 인자 없이 실행될 것이며 이 경우에는 먼저 현재 실행 중인 프로세스들의 윈도우를 검사한다. 윈도우 이름이 “Microsoft”이고 클래스 이름이 “win32app”인 프로세스가 존재할 경우 “WM_COPYDATA” 메시지를 보내고, 일정 시간 sleep 후 해당 프로세스의 파일을 삭제한다.

[그림 2] 특정 윈도우를 갖는 프로세스 처리 함수

참고로 SystemBC는 가장 처음에 윈도우 클래스를 등록하고 윈도우를 생성하였는데, 윈도우 이름을 “Microsoft”로, 클래스 이름을 “win32app”으로 지정하였다. 실제로 SystemBC 실행 시 다음과 같은 윈도우 및 클래스를 확인할 수 있다.

[그림 3] 실행 중인 SystemBC의 윈도우 및 클래스

이때 등록한 윈도우의 메시지 처리 함수는 “WM_COPYDATA” 메시지를 받았을 때 “특정 랜덤 문자열” 이름으로 등록된 작업을 삭제하고 종료하는 기능을 담당한다. 정리하자면 SystemBC는 최초 실행 시 기존에 실행 중이던 SystemBC 프로세스를 조회하며, 존재할 경우 종료 메시지를 보낸다. 해당 메시지를 받은 기존 SystemBC는 자신이 등록된 작업을 삭제하고 종료하며, 두 번째로 실행된 SystemBC는 기존 SystemBC의 바이너리를 삭제한다.

그리고 Emisoft의 제품으로 추정되는 “a2guard.exe”라는 이름의 프로세스를 검사하는데 해당 프로세스가 현재 실행 중일 경우에는 종료되어 더 이상 악성 행위를 수행하지 않는다. 마지막으로 현재 실행 중인 SystemBC 바이너리를 %ALLUSERSPROFILE% 즉 ProgramData 경로의 랜덤 폴더에 랜덤한 이름으로 복사한 후 다시 “특정 랜덤 문자열” 이름의 작업으로 등록한다. 이러한 과정은 COM 객체를 이용하며 TaskScheduler 클래스 및 Task 클래스의 메소드들이 사용된다.

[그림 4] COM 객체를 이용한 작업 등록 과정

작업은 현재 시간 기준 2분 이후부터 동작하며 2분 간격으로 실행된다. 실행 대상은 SystemBC이며 인자로 “start”를 지정하여 실행시킨다. SystemBC는 C&C 서버로부터 exe 형태의 페이로드를 다운로드해 실행할 수 있다. 만약 다운로드된 실행 파일이 최신 버전의 SystemBC일 경우 이러한 과정은 결국 SystemBC의 바이너리 업데이트 과정이 된다.


C&C 통신

“start” 인자와 함께 실행된 SystemBC는 C&C 서버와 통신을 시도한다. SystemBC는 C&C 서버의 주소를 XOR 암호화된 형태로 데이터 섹션에 포함하고 있다. C&C 서버와 통신하기 전에 C&C 서버의 주소와 포트 번호를 복호화하여 사용하며, 첫 번째 주소와의 접속이 불가한 경우에는 두 번째 주소와 통신을 시도한다. 현재 분석 대상의 경우 설정 데이터가 암호화되어 있지 않아 평문 형태로 확인이 가능하다. 참고로 설정 데이터 아래에 “xordata” 문자열이 존재할 경우 XOR 인코딩을 진행하지 않는다. “xordata” 문자열이 존재하는 0x32 바이트 크기의 데이터는 RC4 키 값인데, 일반적인 RC4 키 값이 존재할 경우에는 정상적으로 XOR 인코딩을 진행한다.

[그림 5] SystemBC의 설정 데이터
- C&C 서버 주소 1 : 31.44.185[.]6:4001
- C&C 서버 주소 2 : 31.44.185[.]11:4001

SystemBC는 먼저 다음과 같은 감염 시스템의 기본적인 정보를 수집한다. 아래의 항목들 중에서 현재 실행 중인 SystemBC 프로세스가 관리자 권한 즉 High Integrity Level 이상으로 실행 중일 경우에는 Offset 0x34에 0x2를 설정하며, 아닐 경우에는 0이 설정된다.

오프셋사이즈데이터
+0x000x32RC4 키
+0x320x02윈도우 버전
+0x340x01관리자 권한 여부 (0x02)
+0x350x01WOW64 여부
+0x360x2A사용자 이름
+0x600x04볼륨 시리얼 번호
[표 1] C&C 서버에 전달할 데이터

아래의 데이터는 0x64 바이트의 크기를 가지며, 처음 0x32 바이트의 RC4 키를 이용해 뒤 0x32 바이트를 RC4 암호화한다. 이 데이터를 전달받은 C&C 서버는 처음 0x32 바이트의 RC4 키로 다음 0x32 바이트의 크기를 갖는 감염 시스템의 정보를 복호화 할 수 있을 것이다.

[그림 6] RC4 키와 감염 시스템에서 수집한 정보
- RC4 키 : 78 6F 72 64 61 74 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[그림 7] C&C 서버와의 통신 패킷

이후 암호화된 데이터를 C&C 서버에 전달한다. SystemBC는 C&C 서버와 Raw TCP 소켓을 이용하여 통신하는데, C&C 서버는 이러한 정보를 전달받으면 동일한 RC4 키를 이용해 명령 데이터를 암호화하여 전달한다. 다음은 C&C로부터 전달받은 암호화된 데이터이다.

[그림 8] C&C 서버로부터 전달받은 데이터

SystemBC는 먼저 처음 4바이트를 복호화하는데 복호화 된 4바이트가 C&C 명령의 헤더라고 할 수 있다. 헤더는 크게 세 부분으로 나뉘어 있는데 각각 명령, 보조 명령, 데이터의 사이즈이다. 그리고 이후 4바이트는 토큰을 의미하고 이후에는 명령 데이터가 포함되어 있다.

오프셋사이즈데이터
+0x000x01명령
+0x010x01보조 명
+0x020x02데이터 사이즈
+0x040x04토큰
+0x08가변명령 데이터
[표 2] 다운로드된 패킷 구조

현재 전달받은 명령은 0xFFFF2B00이다. 이것은 0x002B 사이즈의 데이터를 전달받았다는 의미이며, 뒤에 따라오는 0x002B 사이즈의 데이터를 복호화하면 토큰 및 URL 주소를 확인할 수 있다. 명령이 0xFFFF이기 때문에 해당 URL에서 파일을 다운로드해 실행하라는 의미이다.

명령보조 명령사이즈기능
0xFF0xFF가변페이로드 다운로드
0xFF0xFE0x00종료
0x00가변전달받은 대상과의 새로운 Proxy 생성
Index[0x00 – 0xFF]가변C&C 서버로부터 전달받은 데이터를 지정한 Index의 대상에 전달
Index[0x00 – 0xFF]0x00지정된 대상과의 Proxy 종료
[표 3] C&C 명령 종류

참고로 현재 다운로드되는 exe 악성코드 또한 SystemBC이며 이를 통해 바이너리 업데이트를 위한 명령이라는 것을 알 수 있다.

- 다운로드 주소 : hxxp://michaelstefensson[.]com/supd/s.exe
[그림 9] 추가 페이로드 다운로드 URL

SystemBC는 HTTP 통신도 Raw TCP 소켓을 이용한다. 다음은 전달받은 주소에서 바이너리를 다운로드할 때 사용하는 User-Agent 문자열이다.

GET %s HTTP/1.0
Host: %s
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
Connection: close

다운로드 완료 후에는 C&C 서버에 결과를 RC4로 암호화하여 전달한다. 전달할 데이터는 페이로드 다운로드 명령에서 사용된 보조 명령 0xFF와 전달할 데이터 사이즈 0x04 그리고 이전에 전달받은 토큰 값 0x04 바이트를 포함한 0x07 바이트이다.

[그림 10] C&C 서버에 응답 통보
오프셋사이즈데이터
+0x000x01보조 명령
+0x010x02데이터 사이즈
+0x030x04토큰
[표 4] C&C 서버에 전달하는 패킷 구조

전달받은 다운로드 URL 주소는 파일의 확장자 및 포맷에 따라 다음과 같이 구분된다.

종류확장자포맷기능
exeexeSystemBC 자체 업데이트
VBS 스크립트.vbsVBS 스크립트 실행
Batch 스크립트.batBatch 스크립트 실행
Batch 스크립트.cmdBatch 스크립트 실행
파워쉘 스크립트.ps1파워쉘 스크립트 실행
DLLDLL메모리 상에서 DLL 로드
URL 뒤에 # 태그가 붙을 경우 DLL의 해당 함수 실행
쉘코드인코딩된 형태메모리 상에서 쉘코드 실행
[표 5] 다운로드 가능 페이로드
[그림 11] 확장자 및 포맷에 따른 구분

일반적인 파일들은 Temp 경로에 생성하여 작업 스케줄러에 등록하여 실행시키지만, 파워쉘 스크립트의 경우에는 추가적으로 “ -WindowStyle Hidden -ep bypass -file”과 같은 커맨드 라인을 이용해 실행시킨다.

다운로드된 페이로드가 DLL인 경우에는 메모리를 할당하고 로드하여 새로운 쓰레드로 실행시키는데, C&C 서버로부터 전달받은 URL의 뒤에 “#” 문자열이 붙어있는 경우에는 해당 다운로드한 DLL에서 해당 익스포트 함수를 호출한다. 이외에도 쉘코드로 확인될 경우에는 디코딩 루틴을 거쳐 동일하게 새로운 쓰레드로 실행시키며, 결국 DLL 및 쉘코드는 파일 형태로 생성되지 않고 SystemBC의 메모리 상에서 동작한다.


Tor를 이용한 통신

현재 분석 대상 악성코드는 Tor 주소가 존재하지 않기 때문에 여기에서는 과거 Tor 네트워크 통신이 가능했던 사례를 다룬다. 이 악성코드는 다음과 같은 C&C 서버 주소가 인코딩되어 존재하지만 2개의 C&C 서버에 모두 접속이 불가할 경우에는 Tor를 이용하여 또 다른 C&C 서버에 접속 시도한다.

- C&C 서버 주소 1 : admex175x[.]xyz:4044
- C&C 서버 주소 2 : servx278x[.]xyz:4044

이를 위해 다음과 같은 주소에 접속하여 공인 IP 주소를 얻어오며, 이렇게 획득한 공인 IP 주소는 C&C 서버에 전달하는 데이터들과 함께 인코딩되어 전달된다.

https://api.ipify.org/
https://ip4.seeip.org/

SystemBC는 mini-tor[5] 라이브러리를 이용해 Tor 네트워크를 사용하는 것으로 알려져 있다.[6] 먼저 Tor 연결을 위한 초기화 과정을 진행하는데, 하드코딩되어 존재하는 Authoritative Directory Server들의 IP 주소 중 하나를 랜덤으로 선택하여 Tor 네트워크에 대한 Consensus 데이터를 구하고, 전달받은 설정 데이터를 기반으로 Tor 통신을 시작한다.

[그림 12] Tor Consensus 데이터 획득
193.23.244[.]244:80
86.59.21[.]38:80
199.58.81[.]140:80
204.13.164[.]118:80
194.109.206[.]212:80
131.188.40[.]189:80
154.35.175[.]225:80
171.25.193[.]9:443
128.31.0[.]34:9131
128.31.0[.]39:9131

이후 Tor C&C 주소를 구하는데 아래와 같이 Xor 복호화 후 텍스트 형태로 확인 가능한 일반적인 C&C 주소와 달리 Tor C&C 주소는 추가적인 복호화 과정이 필요하다. 아래에서 “TOR:” 문자열 뒤에 나오는 항목이 1차적으로 복호화된 Tor C&C 주소이며, 추가적인 복호화 과정을 통해 실제 주소를 확인할 수 있다.

[그림 13] Xor 인코딩된 설정 데이터
[그림 14] 최종적으로 복호화된 C&C 주소
- C&C 주소 (Tor) : dfhg72lymw7s3d7b[.]onion:4044

Tor 네트워크에 정상적으로 접속한 이후에는 앞에서 언급한 공인 IP 주소를 포함한 감염 시스템의 정보를 전달한다. 참고로 Tor 네트워크를 통해 데이터를 전달한다는 점을 제외하면 기존의 Raw TCP 소켓 통신을 이용하는 다른 형태들과 동일하다. 즉 기존과 같이 RC4 알고리즘으로 암호화한 데이터를 전달하고, 동일한 키 값으로 암호화된 C&C 명령을 전달받는다. 이는 추가 페이로드를 다운로드할 때 사용되는 HTTP 통신에서도 동일하다.

[그림 15] Tor를 통해 전달 받은 C&C 명령
- 다운로드 주소 : http://5.61.33[.]200/henos.exe

Socks5 Proxy

SystemBC의 주요 기능은 다운로더 외에도 Proxy Bot으로 동작하는 것이 있다. 다음은 위에서 다룬 프록시 관련 명령인데, 각각 프록시를 위한 소켓을 생성하고 특정 프록시 패킷을 처리하는 기능을 담당한다.

[그림 16] Socks5 프록시 루틴

공격자가 감염 시스템을 Proxy Bot으로 사용하고자 할 경우, 즉 특정 주소에 연결할 때 감염 시스템의 SystemBC를 통해 연결하려고 할 경우 먼저 프록시 생성 명령이 전달될 것이다. SystemBC는 프록시 생성 명령을 받으면 전달받은 타입에 따라 소켓을 생성한다. 이렇게 생성된 소켓은 index에 따라 관리된다.

소켓 생성 이후에는 새로운 쓰레드를 생성하고 전달받은 주소에 연결한다. 참고로 이전에 공격자가 BackConnect라고 이름 붙인 것은 공격자가 직접 SystemBC에 접속하여 Socks5 프록시 연결을 시도하는 대신 SystemBC가 먼저 공격자의 C&C 서버로 연결하기 때문이다. SystemBC가 사설 IP 대역의 시스템에 설치될 경우에는 외부에서 접속이 불가하기 때문에 Proxy 기능을 갖는 악성코드들은 주로 이러한 Reverse Proxy 방식을 사용한다.

이후 공격자가 특정 주소에 요청을 보낼 경우에는 생성한 프록시 소켓을 Index를 지정하여 전달할 것이고 SystemBC는 전달받은 데이터를 해당 주소에 전송한다. 그리고 전달받은 데이터는 다시 SystemBC를 거쳐 C&C 서버에 전달된다. SystemBC는 이렇게 Proxy Bot으로서 동작하게 되며 공격자는 실제 자신의 IP를 숨긴 상태로 공격을 수행할 수 있다. 그리고 만약 SystemBC가 내부망 접근이 가능한 시스템에서 동작할 경우 외부의 공격자는 해당 SystemBC를 거쳐 내부망에 대한 접근이 가능해진다.


과거 버전과의 비교

위에서는 대부분의 기능을 지원하는 Type 2 형태를 다루었지만 각각은 사소한 차이점과 지원하는 기능에서 차이점이 있다.

Type 1Type 2Type 3
재귀 실행 인자“Start2”“start”“start”
Emisoft 제품 검사OOX
설치 경로%ALLUSERSPROFILE%\[Random]%ALLUSERSPROFILE%\[Random]현재 경로
다운로더 기능X (업데이트만 존재)Batch, VBS, PowerShell, DLL, Shellcode 및 업데이트Batch, VBS, PowerShell 및 업데이트
단축 도메인 .bit 지원OXX
[표 6] Type 별 차이점

Type 1에서는 “.bit” 단축 도메인을 지원한다. 먼저 다음 악성코드의 설정 데이터를 보면 C&C 주소 및 포트 번호 외에 DNS 서버의 리스트가 존재한다.

[그림 17] 설정 데이터 중 DNS 서버 목록
- C&C 서버 주소 1 : db1.pushsecs[.]info:40690
- C&C 서버 주소 2 : db2.pushsecs[.]info:40690
- DNS 서버 주소 1 : 5.132.191[.]104
- DNS 서버 주소 2 : ns1.vic.au.dns.opennic[.]glue
- DNS 서버 주소 3 : ns2.vic.au.dns.opennic[.]glue

만약 C&C 서버 주소가 “.bit”으로 끝날 경우에는 위의 DNS 서버들을 이용해서 C&C 서버의 IP 주소를 획득한다.

[그림 18] .bit 주소에 대한 DNS 쿼리 루틴



결론

SystemBC는 과거 익스플로잇 킷을 통해 유포된 것을 시작으로, 최근까지도 상용 소프트웨어의 크랙, 시리얼 다운로드 페이지로 위장한 악성 사이트에서 다른 악성코드들을 통해 설치되고 있다. 또한 이러한 일반 사용자들을 대상으로 하는 공격 외에 기업을 대상으로 하는 다수의 랜섬웨어 공격에서도 추가적인 목적을 달성하기 위해 사용된 사례가 존재한다.

SystemBC는 설치 이후 감염 시스템에 상주하면서 추가 페이로드를 다운로드하는 행위뿐만 아니라 Proxy Bot으로도 동작하여 다른 공격자들에 의해 공격의 통로로서도 활용될 수 있다. 사용자들은 OS 및 인터넷 브라우저 등의 프로그램들에 대한 최신 패치 및 V3를 최신 버전으로 업데이트하여 이러한 악성코드의 감염을 사전에 차단할 수 있도록 신경 써야 한다.

안랩 제품에서는 해당 악성코드들을 다음과 같이 진단하고 있다.

[파일 진단]
– Trojan/Win.MalPE.R480644 (2022.03.29.02)
– Trojan/Win.Generic.C5006057 (2022.03.11.03)
– Malware/Win32.RL_Generic.R358611 (2020.12.18.01)
– Trojan/Win32.Agent.C3511593 (2019.10.14.08)

[IOC]
Type 1 MD5

– beb92b763b426ad60e8fdf87ec156d50

Type 2 MD5
– 8e3a80163ebba090c69ecdeec8860c8b
– 28c2680f129eac906328f1af39995787

Type 3 MD5
– ae3f6af06a02781e995650761b3a82c6

Type 1 C&C
– db1.pushsecs[.]info:40690
– db2.pushsecs[.]info:40690

Type 2 C&C
– 31.44.185[.]6:4001
– 31.44.185[.]11:4001
– admex175x[.]xyz:4044
– servx278x[.]xyz:4044
– dfhg72lymw7s3d7b[.]onion:4044

Type 3 C&C
– 96.30.196[.]207:4177
– 45.32.132[.]182:4177

다운로드 주소
– hxxp://michaelstefensson[.]com/supd/s.exe
– hxxp://5.61.33[.]200/henos.exe

연관 IOC 및 관련 상세 분석 정보는 안랩의 차세대 위협 인텔리전스 플랫폼 ‘AhnLab TIP’ 구독 서비스를 통해 확인 가능하다.

5 1 vote
별점 주기
guest
0 댓글
Inline Feedbacks
View all comments