Skip to content

Commit 7c3048d

Browse files
rymshaclaude
andauthored
#12142 Reject path traversal in imported binary references (#12141)
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 1b98244 commit 7c3048d

3 files changed

Lines changed: 47 additions & 0 deletions

File tree

modules/core/core-export/src/main/java/com/enonic/xp/core/impl/export/NodeImporter.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.enonic.xp.core.impl.export.xml.XmlException;
1717
import com.enonic.xp.core.impl.export.xml.XmlNodeParser;
1818
import com.enonic.xp.core.impl.export.xml.XsltTransformer;
19+
import com.enonic.xp.core.internal.FileNames;
1920
import com.enonic.xp.data.Property;
2021
import com.enonic.xp.data.PropertyTree;
2122
import com.enonic.xp.data.ValueTypes;
@@ -361,6 +362,12 @@ private void addBinary( final VirtualFile nodeFile, final BinaryAttachments.Buil
361362
private VirtualFile tryFindBinaryFile( final VirtualFile nodeFile, final BinaryReference binaryReference )
362363
{
363364
final String binaryReferenceAsString = binaryReference.toString();
365+
366+
if ( !FileNames.isSafeFileName( Normalizer.normalize( binaryReferenceAsString, Normalizer.Form.NFC ) ) )
367+
{
368+
throw new ImportNodeException( "Invalid binary reference: " + binaryReferenceAsString );
369+
}
370+
364371
final VirtualFile binaryOriginal =
365372
nodeFile.resolve( nodeFile.getPath().join( SYSTEM_FOLDER_NAME, BINARY_FOLDER, binaryReferenceAsString ) );
366373

modules/itest/itest-core/src/test/java/com/enonic/xp/core/export/NodeImporterIntegrationTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,27 @@ void import_with_binary()
389389
assertNotNull( attachedBinary.getBlobKey() );
390390
}
391391

392+
@Test
393+
void import_with_binary_path_traversal_rejected()
394+
throws Exception
395+
{
396+
final Path file = Files.createDirectories(
397+
resolveInTemporaryFolder( "myExport", "mynode" ).resolve( NodeExportPathResolver.SYSTEM_FOLDER_NAME ) ).resolve(
398+
NodeExportPathResolver.NODE_XML_EXPORT_NAME );
399+
copyFormResource( "node_with_traversal_binary.xml", file );
400+
401+
final NodeImportResult result = NodeImporter.create().
402+
nodeService( this.nodeService ).
403+
targetNodePath( NodePath.ROOT ).
404+
sourceDirectory( VirtualFiles.from( temporaryFolder.resolve( "myExport" ) ) ).
405+
build().
406+
execute();
407+
408+
assertNull( nodeService.getByPath( new NodePath( "/mynode" ) ) );
409+
assertTrue( result.getImportErrors().stream()
410+
.anyMatch( error -> error.getException().contains( "Invalid binary reference" ) ) );
411+
}
412+
392413
@Test
393414
void import_special_characters()
394415
throws Exception
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<node>
2+
<childOrder>_name DESC</childOrder>
3+
<nodeType>content</nodeType>
4+
<permissions/>
5+
<data>
6+
<string name="myString">myStringValue</string>
7+
<binaryReference name="myImage">../../../../../../../../etc/passwd</binaryReference>
8+
</data>
9+
<indexConfigs>
10+
<defaultConfig>
11+
<decideByType>false</decideByType>
12+
<enabled>true</enabled>
13+
<nGram>true</nGram>
14+
<fulltext>true</fulltext>
15+
<includeInAllText>true</includeInAllText>
16+
</defaultConfig>
17+
<pathIndexConfigs/>
18+
</indexConfigs>
19+
</node>

0 commit comments

Comments
 (0)