パスワードの長さは512文字に制限されています。
redis.hで:
#define REDIS_AUTHPASS_MAX_LEN 512
config.cの場合:
} else if (!strcasecmp(argv[0],"requirepass") && argc == 2) {
if (strlen(argv[1]) > REDIS_AUTHPASS_MAX_LEN) {
err = "Password is longer than REDIS_AUTHPASS_MAX_LEN";
goto loaderr;
}
server.requirepass = zstrdup(argv[1]);
}
現在、構成ファイルの解析メカニズムは非常に基本的です。すべての行は、sds(文字列管理)ライブラリのsdssplitargs関数を使用して分割されます。この関数は、次のような特定の文字シーケンスを解釈します。
- 一重引用符と二重引用符
- \x16進数
- \ n、\ r、\ t、\ b、\aなどの特殊文字
ここで問題となるのは、パスワードに二重引用符が1文字含まれていることです。文字列の最後に一致する二重引用符がないため、解析は失敗します。その場合、sdssplitargs関数はNULLポインターを返します。このポインタがconfig.cコードで適切にチェックされていないため、コアダンプが発生します。
/* Split into arguments */
argv = sdssplitargs(lines[i],&argc);
sdstolower(argv[0]);
これは、IMOに提出する必要があるバグです。
簡単な回避策は、二重引用符またはその他の解釈された文字を16進シーケンス(つまり、二重引用符の場合は\ x22)に置き換えることです。