
MySQL Community Server 26.7.0 - उच्च - mysqlbinlog --raw Rotate path leftover - client file write
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqlbinlog-raw-path
वर्ग: फ़ाइल राइट (क्लाइंट) पहुँच: रिमोट (UI:R)
MySQL Community Server mysqlbinlog 26.7.0 (06a5c1c) - Oracle
mysqlbinlog --raw --read-from-remote-server एक Rotate इवेंट के new_log_ident को log_file_name में कॉपी करता है, बिना किसी basename जाँच के। अगला FORMAT_DESCRIPTION इवेंट उस पथ को my_fopen करता है और BINLOG_MAGIC के साथ इवेंट लिखता है। एक शत्रुतापूर्ण डंप जो / के साथ एक असली Rotate ident भेजता है, वह फ़ाइल को क्लाइंट UID के रूप में लिखता है।
--raw प्रलेखित रिमोट binlog फ़ाइल कॉपी है। बचा हुआ हिस्सा ident को एक पथ के रूप में मान रहा है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | फ़ाइल राइट (क्लाइंट --raw BINLOG_MAGIC) |
| पहुँच | रिमोट (पीड़ित हमलावर डंप के विरुद्ध mysqlbinlog --raw -R चलाता है; UI:R) |
| CWE | CWE-22 |
| CVSS | उच्च: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| उत्पाद | MySQL Community Server mysqlbinlog |
| प्रभावित | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| प्रमाणीकरण | पीड़ित हमलावर डंप के विरुद्ध mysqlbinlog --raw -R चलाता है |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1। BINLOG_MAGIC के साथ साक्षी फ़ाइल। फ़ाइल राइट, RCE नहीं। |
एक MySQL-प्रोटोकॉल सर्वर खड़ा करें। COM_BINLOG_DUMP बोलें। एक मेल खाता नकली Rotate भेजें (टाइमस्टैम्प 0, ident अनुरोधित लॉग नाम के बराबर) ताकि डंप रुके नहीं। एक असली Rotate भेजें (टाइमस्टैम्प != 0) जिसका ident /abs/path है। एक FORMAT_DESCRIPTION इवेंट भेजें।
जिस ऑपरेटर ने mysqlbinlog --raw -R ... mysql-bin.000001 चलाया, वह /abs/path को क्लाइंट UID के रूप में लिखता है। सामग्री binlog बाइट्स (\xfebin के साथ FD इवेंट) है, कोई मनमाना पेलोड नहीं। उस UID द्वारा बनाए जा सकने वाले किसी भी पथ को ओवरराइट करें।
एक असली mysqld / के साथ Rotate ident उत्सर्जित नहीं करेगा। बचा हुआ हिस्सा क्लाइंट है।
वही 26.7.0 शिकार जो mysqldump SHOW TABLES overflow और mysqldump --tab path में था। डिफ़ॉल्ट डेमन खाली था। क्लाइंट टूल्स अभी भी रिमोट नामों पर भरोसा करते थे।
if (raw_mode) {
if (output_file != nullptr) {
snprintf(log_file_name, sizeof(log_file_name), "%s%s", output_file,
rev->new_log_ident);
} else {
my_stpcpy(log_file_name, rev->new_log_ident);
}
}
नकली Rotate (when.tv_sec == 0) जिसका ident अनुरोधित लॉग से मेल नहीं खाता, डंप को रोक देता है। मेल खाता नकली Rotate कॉपी के बाद छोड़ दिया जाता है (continue)। असली Rotate नहीं रोकता। अगला FD:
if (!(result_file = my_fopen(
log_file_name, O_WRONLY | MY_FOPEN_BINARY, MYF(MY_WME)))) {
error("Could not create log file '%s'", log_file_name);
LOAD DATA temps tmpdir के अंतर्गत SQL_LOAD_MB रहते हैं। बंद। Ident लंबाई FN_REFLEN-1 तक सीमित है। / हटाया नहीं जाता।
पहले से दर्ज गलत रास्ते: एक नकली Rotate भेजना जिसका ident पथ है (डंप रुक जाता है); --result-file का उपयोग करना (ident एक प्रीफ़िक्स बन जाता है, अलग बचा हुआ हिस्सा); ओरेकल के रूप में एक असली mysqld; चेकसम चालू छोड़े गए।
cd lab
./run.sh
इमेज mysql:26.7.0। बाइनरी /usr/libexec/mysqlsh/mysqlbinlog Ver 26.7.0 (उस इमेज में PATH पर नहीं)। कंट्रोल स्टब: नकली Rotate mysql-bin.000001 के साथ FD work/mysql-bin.000001 लिखता है। ट्रैवर्सल स्टब: मेल खाता नकली Rotate, असली Rotate ident /work/oracle/MYSQL-BINLOG-RAW-WITNESS, FD उस पथ को लिखता है (BINLOG_MAGIC)। प्रकाशित 127.0.0.1:18620 / 18621। इसे लूपबैक पर बाइंड करें। binlog बाइट्स का फ़ाइल राइट, RCE नहीं। कोई --result-file नहीं।
control-basename=yes
traversal-outside=yes
SUCCESS mysql-mysqlbinlog-raw-path ... MYSQL-BINLOG-RAW-WITNESS
log_file_name में my_stpcpy / snprintf से पहले new_log_ident का basename लें। --raw को cwd या --result-file प्रीफ़िक्स के अंतर्गत लिखना चाहिए, / वाले ident के अंतर्गत नहीं।
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)client/mysqlbinlog.cc dump_remote_log_entries