mirror of https://github.com/apache/lucene.git
SOLR-10031: Validation of filename params in ReplicationHandler
This commit is contained in:
parent
bb5bf3fbf7
commit
6f598d2469
|
@ -161,6 +161,8 @@ Bug Fixes
|
||||||
* SOLR-9969: "Plugin/Stats" section of the UI doesn't display empty metric types (Tomás Fernández Löbbe)
|
* SOLR-9969: "Plugin/Stats" section of the UI doesn't display empty metric types (Tomás Fernández Löbbe)
|
||||||
* SOLR-8491: solr.cmd SOLR_SSL_OPTS is overwritten (Sam Yi, Andy Hind, Marcel Berteler, Kevin Risden)
|
* SOLR-8491: solr.cmd SOLR_SSL_OPTS is overwritten (Sam Yi, Andy Hind, Marcel Berteler, Kevin Risden)
|
||||||
|
|
||||||
|
* SOLR-10031: Validation of filename params in ReplicationHandler (Hrishikesh Gadre, janhoy)
|
||||||
|
|
||||||
================== 6.4.0 ==================
|
================== 6.4.0 ==================
|
||||||
|
|
||||||
Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.
|
Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.
|
||||||
|
|
|
@ -29,6 +29,8 @@ import java.nio.ByteBuffer;
|
||||||
import java.nio.channels.FileChannel;
|
import java.nio.channels.FileChannel;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.NoSuchFileException;
|
import java.nio.file.NoSuchFileException;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
@ -1418,9 +1420,10 @@ public class ReplicationHandler extends RequestHandlerBase implements SolrCoreAw
|
||||||
params = solrParams;
|
params = solrParams;
|
||||||
delPolicy = core.getDeletionPolicy();
|
delPolicy = core.getDeletionPolicy();
|
||||||
|
|
||||||
fileName = params.get(FILE);
|
fileName = validateFilenameOrError(params.get(FILE));
|
||||||
cfileName = params.get(CONF_FILE_SHORT);
|
cfileName = validateFilenameOrError(params.get(CONF_FILE_SHORT));
|
||||||
tlogFileName = params.get(TLOG_FILE);
|
tlogFileName = validateFilenameOrError(params.get(TLOG_FILE));
|
||||||
|
|
||||||
sOffset = params.get(OFFSET);
|
sOffset = params.get(OFFSET);
|
||||||
sLen = params.get(LEN);
|
sLen = params.get(LEN);
|
||||||
compress = params.get(COMPRESSION);
|
compress = params.get(COMPRESSION);
|
||||||
|
@ -1434,6 +1437,22 @@ public class ReplicationHandler extends RequestHandlerBase implements SolrCoreAw
|
||||||
rateLimiter = new RateLimiter.SimpleRateLimiter(maxWriteMBPerSec);
|
rateLimiter = new RateLimiter.SimpleRateLimiter(maxWriteMBPerSec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Throw exception on directory traversal attempts
|
||||||
|
protected String validateFilenameOrError(String filename) {
|
||||||
|
if (filename != null) {
|
||||||
|
Path filePath = Paths.get(filename);
|
||||||
|
filePath.forEach(subpath -> {
|
||||||
|
if ("..".equals(subpath.toString())) {
|
||||||
|
throw new SolrException(ErrorCode.FORBIDDEN, "File name cannot contain ..");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (filePath.isAbsolute()) {
|
||||||
|
throw new SolrException(ErrorCode.FORBIDDEN, "File name must be relative");
|
||||||
|
}
|
||||||
|
return filename;
|
||||||
|
} else return null;
|
||||||
|
}
|
||||||
|
|
||||||
protected void initWrite() throws IOException {
|
protected void initWrite() throws IOException {
|
||||||
if (sOffset != null) offset = Long.parseLong(sOffset);
|
if (sOffset != null) offset = Long.parseLong(sOffset);
|
||||||
if (sLen != null) len = Integer.parseInt(sLen);
|
if (sLen != null) len = Integer.parseInt(sLen);
|
||||||
|
|
|
@ -1424,6 +1424,21 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
|
||||||
assertTrue(timeTakenInSeconds - approximateTimeInSeconds > 0);
|
assertTrue(timeTakenInSeconds - approximateTimeInSeconds > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void doTestIllegalFilePaths() throws Exception {
|
||||||
|
// Loop through the file=, cf=, tlogFile= params and prove that it throws exception for path traversal attempts
|
||||||
|
List<String> illegalFilenames = Arrays.asList("/foo/bar", "../dir/traversal", "illegal\rfile\nname\t");
|
||||||
|
List<String> params = Arrays.asList(ReplicationHandler.FILE, ReplicationHandler.CONF_FILE_SHORT, ReplicationHandler.TLOG_FILE);
|
||||||
|
for (String param : params) {
|
||||||
|
for (String filename : illegalFilenames) {
|
||||||
|
try {
|
||||||
|
invokeReplicationCommand(masterJetty.getLocalPort(), "filecontent&" + param + "=" + filename);
|
||||||
|
fail("Should have thrown exception on illegal path for param " + param + " and file name " + filename);
|
||||||
|
} catch (Exception e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class AddExtraDocs implements Runnable {
|
private class AddExtraDocs implements Runnable {
|
||||||
|
|
||||||
SolrClient masterClient;
|
SolrClient masterClient;
|
||||||
|
|
Loading…
Reference in New Issue