- fix Zip Decompress Parent Path Injection #1968 bug

- add valid patch check test
- add vulnearbility triggering zip archive and test
- remove temporary test output files
- if possible, redirect temporary file generation to temp directory or
- delete temporary files after tests
This commit is contained in:
Alex Fabijanic 2017-11-01 19:25:24 -05:00
parent bdbc94d825
commit f5b2cf3dd6
14 changed files with 122 additions and 379 deletions

View File

@ -80,7 +80,7 @@ bool Decompress::handleZipEntry(std::istream& zipStream, const ZipLocalFileHeade
{
std::string dirName = hdr.getFileName();
if (!ZipCommon::isValidPath(dirName))
throw ZipException("Illegal entry name " + dirName + " containing parent directory reference");
throw ZipException("Illegal entry name " + dirName);
Poco::Path dir(_outDir, dirName);
dir.makeDirectory();
Poco::File aFile(dir);
@ -100,7 +100,7 @@ bool Decompress::handleZipEntry(std::istream& zipStream, const ZipLocalFileHeade
}
if (!ZipCommon::isValidPath(fileName))
throw ZipException("Illegal entry name " + fileName + " containing parent directory reference");
throw ZipException("Illegal entry name " + fileName);
Poco::Path file(fileName);
file.makeFile();

View File

@ -13,6 +13,7 @@
#include "Poco/Zip/ZipCommon.h"
#include "Poco/Path.h"
namespace Poco {
@ -21,15 +22,26 @@ namespace Zip {
bool ZipCommon::isValidPath(const std::string& path)
{
if (!Path(path).isRelative())
return false;
if (path == "..")
return false;
if (path.compare(0, 3, "../") == 0)
if ((path.size() >= 3) && path.compare(0, 3, "../") == 0)
return false;
if (path.compare(0, 3, "..\\") == 0)
if ((path.size() >= 3) && path.compare(0, 3, "..\\") == 0)
return false;
if (path.find("/..") != std::string::npos)
if (path.find("/../") != std::string::npos)
return false;
if (path.find("\\..") != std::string::npos)
if (path.find("\\..\\") != std::string::npos)
return false;
if (path.find("/..\\") != std::string::npos)
return false;
if (path.find("\\../") != std::string::npos)
return false;
if ((path.size() >= 2) && path.compare(0, 2, "~/") == 0)
return false;
if (path.size() > 0 && (path[0] == '/' || path[0] == '\\'))
return false;
return true;
}

BIN
Zip/testsuite/data/vuln.zip Normal file

Binary file not shown.

View File

@ -1 +0,0 @@
just some test data

View File

@ -38,7 +38,7 @@ CompressTest::~CompressTest()
void CompressTest::testSingleFile()
{
std::ofstream out("appinf.zip", std::ios::binary);
std::ofstream out(Poco::Path::temp() + "appinf.zip", std::ios::binary);
Poco::Path theFile(ZipTest::getTestFile("data", "test.zip"));
Compress c(out, true);
c.addFile(theFile, theFile.getFileName());
@ -48,10 +48,9 @@ void CompressTest::testSingleFile()
void CompressTest::testDirectory()
{
std::ofstream out("pocobin.zip", std::ios::binary);
std::ofstream out(Poco::Path::temp() + "pocobin.zip", std::ios::binary);
Poco::File aFile("some/");
if (aFile.exists())
aFile.remove(true);
if (aFile.exists()) aFile.remove(true);
Poco::File aDir("some/recursive/dir/");
aDir.createDirectories();
Poco::File aDir2("some/other/recursive/dir/");
@ -67,19 +66,20 @@ void CompressTest::testDirectory()
Compress c(out, true);
c.addRecursive(theFile, ZipCommon::CL_MAXIMUM, false, theFile);
ZipArchive a(c.close());
Poco::File(aFile).remove(true);
}
void CompressTest::testManipulator()
{
{
std::ofstream out("appinf.zip", std::ios::binary);
std::ofstream out(Poco::Path::temp() + "appinf.zip", std::ios::binary);
Poco::Path theFile(ZipTest::getTestFile("data", "test.zip"));
Compress c(out, true);
c.addFile(theFile, theFile.getFileName());
ZipArchive a(c.close());
}
ZipManipulator zm("appinf.zip", true);
ZipManipulator zm(Poco::Path::temp() + "appinf.zip", true);
zm.renameFile("test.zip", "renamedtest.zip");
zm.addFile("doc/othertest.zip", ZipTest::getTestFile("data", "test.zip"));
ZipArchive archive=zm.commit();
@ -90,13 +90,13 @@ void CompressTest::testManipulator()
void CompressTest::testManipulatorDel()
{
{
std::ofstream out("appinf.zip", std::ios::binary);
std::ofstream out(Poco::Path::temp() + "appinf.zip", std::ios::binary);
Poco::Path theFile(ZipTest::getTestFile("data", "test.zip"));
Compress c(out, true);
c.addFile(theFile, theFile.getFileName());
ZipArchive a(c.close());
}
ZipManipulator zm("appinf.zip", true);
ZipManipulator zm(Poco::Path::temp() + "appinf.zip", true);
zm.deleteFile("test.zip");
zm.addFile("doc/data.zip", ZipTest::getTestFile("data", "data.zip"));
ZipArchive archive=zm.commit();
@ -108,13 +108,13 @@ void CompressTest::testManipulatorDel()
void CompressTest::testManipulatorReplace()
{
{
std::ofstream out("appinf.zip", std::ios::binary);
std::ofstream out(Poco::Path::temp() + "appinf.zip", std::ios::binary);
Poco::Path theFile(ZipTest::getTestFile("data", "test.zip"));
Compress c(out, true);
c.addFile(theFile, theFile.getFileName());
ZipArchive a(c.close());
}
ZipManipulator zm("appinf.zip", true);
ZipManipulator zm(Poco::Path::temp() + "appinf.zip", true);
zm.replaceFile("test.zip", ZipTest::getTestFile("data", "doc.zip"));
ZipArchive archive=zm.commit();
@ -126,7 +126,7 @@ void CompressTest::testManipulatorReplace()
void CompressTest::testSetZipComment()
{
std::string comment("Testing...123...");
std::ofstream out("comment.zip", std::ios::binary);
std::ofstream out(Poco::Path::temp() + "comment.zip", std::ios::binary);
Poco::Path theFile(ZipTest::getTestFile("data", "test.zip"));
Compress c(out, true);
c.addFile(theFile, theFile.getFileName());
@ -157,27 +157,28 @@ void CompressTest::createDataFile(const std::string& path, Poco::UInt64 size)
void CompressTest::testZip64()
{
typedef std::map<std::string, Poco::UInt64> FileMap;
std::cout << std::endl;
std::map<std::string, Poco::UInt64> files;
FileMap files;
files["data1.bin"] = static_cast<Poco::UInt64>(KB)*4096+1;
files["data2.bin"] = static_cast<Poco::UInt64>(KB)*16;
files["data3.bin"] = static_cast<Poco::UInt64>(KB)*4096-1;
for(std::map<std::string, Poco::UInt64>::const_iterator it = files.begin(); it != files.end(); it++)
for(FileMap::const_iterator it = files.begin(); it != files.end(); it++)
{
std::cout << '\t' << "createDataFile(" << it->first << ", " << it->second << ");" << std::endl;
createDataFile(it->first, it->second);
}
std::ofstream out("zip64.zip", std::ios::binary | std::ios::trunc);
std::ofstream out(Poco::Path::temp() + "zip64.zip", std::ios::binary | std::ios::trunc);
Compress c(out, true, true);
for(std::map<std::string, Poco::UInt64>::const_iterator it = files.begin(); it != files.end(); it++)
for(FileMap::const_iterator it = files.begin(); it != files.end(); it++)
{
const std::string& path = it->first;
std::cout << '\t' << "addFile(" << path << ");" << std::endl;
c.addFile(path, path, ZipCommon::CM_STORE);
}
ZipArchive a(c.close());
for(std::map<std::string, Poco::UInt64>::const_iterator it = files.begin(); it != files.end(); it++)
for(FileMap::const_iterator it = files.begin(); it != files.end(); it++)
{
const std::string& path = it->first;
Poco::UInt64 size = it->second;
@ -187,6 +188,10 @@ void CompressTest::testZip64()
assert(file.getUncompressedSize() == size);
assert(file.getCompressedSize() == size);
}
for (FileMap::const_iterator it = files.begin(); it != files.end(); it++)
{
Poco::File(it->first).remove();
}
}

View File

@ -100,7 +100,7 @@ void ZipTest::testCrcAndSizeAfterData()
std::string testFile = getTestFile("data", "data.zip");
std::ifstream inp(testFile.c_str(), std::ios::binary);
assert (inp.good());
Decompress dec(inp, Poco::Path());
Decompress dec(inp, Poco::Path::temp());
dec.EError += Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
dec.decompressAllFiles();
dec.EError -= Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
@ -124,7 +124,7 @@ void ZipTest::testCrcAndSizeAfterDataWithArchive()
Poco::Path path(it->second.getFileName());
if (path.isFile())
{
std::ofstream os("test.dat");
std::ofstream os(Poco::Path::temp() + "test.dat");
Poco::StreamCopier::copyStream(zipis,os);
}
}
@ -161,7 +161,7 @@ void ZipTest::testDecompress()
std::string testFile = getTestFile("data", "test.zip");
std::ifstream inp(testFile.c_str(), std::ios::binary);
assert (inp.good());
Decompress dec(inp, Poco::Path());
Decompress dec(inp, Poco::Path::temp());
dec.EError += Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
dec.decompressAllFiles();
dec.EError -= Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
@ -175,7 +175,35 @@ void ZipTest::testDecompressFlat()
std::string testFile = getTestFile("data", "test.zip");
std::ifstream inp(testFile.c_str(), std::ios::binary);
assert (inp.good());
Decompress dec(inp, Poco::Path(), true);
Decompress dec(inp, Poco::Path::temp(), true);
dec.EError += Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
dec.decompressAllFiles();
dec.EError -= Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
assert (_errCnt == 0);
assert (!dec.mapping().empty());
}
void ZipTest::testDecompressVuln()
{
std::string testFile = getTestFile("data", "vuln.zip");
std::ifstream inp(testFile.c_str(), std::ios::binary);
assert(inp.good());
Decompress dec(inp, Poco::Path::temp());
dec.EError += Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
dec.decompressAllFiles();
dec.EError -= Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
assert (_errCnt == 1);
assert (dec.mapping().empty());
}
void ZipTest::testDecompressFlatVuln()
{
std::string testFile = getTestFile("data", "vuln.zip");
std::ifstream inp(testFile.c_str(), std::ios::binary);
assert(inp.good());
Decompress dec(inp, Poco::Path::temp(), true);
dec.EError += Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
dec.decompressAllFiles();
dec.EError -= Poco::Delegate<ZipTest, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string> >(this, &ZipTest::onDecompressError);
@ -196,8 +224,8 @@ void ZipTest::verifyDataFile(const std::string& path, Poco::UInt64 size)
std::memset(buffer2.begin(), 0, buffer2.size());
Poco::UInt64 bytesToRead = std::min(size, static_cast<Poco::UInt64>(buffer2.size()));
in.read(buffer2.begin(), bytesToRead);
assert(!in.fail() );
assert(std::memcmp(buffer1.begin(), buffer2.begin(), static_cast<std::size_t>(bytesToRead)) == 0);
assert (!in.fail() );
assert (std::memcmp(buffer1.begin(), buffer2.begin(), static_cast<std::size_t>(bytesToRead)) == 0);
size -= bytesToRead;
}
char c;
@ -209,9 +237,9 @@ void ZipTest::verifyDataFile(const std::string& path, Poco::UInt64 size)
void ZipTest::testDecompressZip64()
{
std::map<std::string, Poco::UInt64> files;
files["data1.bin"] = static_cast<Poco::UInt64>(KB)*4096+1;
files["data2.bin"] = static_cast<Poco::UInt64>(KB)*16;
files["data3.bin"] = static_cast<Poco::UInt64>(KB)*4096-1;
files[Poco::Path::temp() + "data1.bin"] = static_cast<Poco::UInt64>(KB)*4096+1;
files[Poco::Path::temp() + "data2.bin"] = static_cast<Poco::UInt64>(KB)*16;
files[Poco::Path::temp() + "data3.bin"] = static_cast<Poco::UInt64>(KB)*4096-1;
for(std::map<std::string, Poco::UInt64>::const_iterator it = files.begin(); it != files.end(); it++)
{
@ -219,8 +247,8 @@ void ZipTest::testDecompressZip64()
if(file.exists())
file.remove();
}
std::ifstream in("zip64.zip", std::ios::binary);
Decompress c(in, ".");
std::ifstream in(Poco::Path::temp() + "zip64.zip", std::ios::binary);
Decompress c(in, Poco::Path::temp());
c.decompressAllFiles();
for(std::map<std::string, Poco::UInt64>::const_iterator it = files.begin(); it != files.end(); it++)
{
@ -229,6 +257,43 @@ void ZipTest::testDecompressZip64()
}
void ZipTest::testValidPath()
{
assert (ZipCommon::isValidPath("."));
assert (ZipCommon::isValidPath("file.txt"));
assert (ZipCommon::isValidPath(".file.txt"));
assert (ZipCommon::isValidPath("..file.txt"));
assert (ZipCommon::isValidPath("file.txt.."));
assert (ZipCommon::isValidPath(".file..txt"));
assert (ZipCommon::isValidPath("~file..txt"));
assert (ZipCommon::isValidPath("~file/~"));
assert (ZipCommon::isValidPath("dir/~"));
assert (ZipCommon::isValidPath("some"));
assert (ZipCommon::isValidPath("some/dir"));
assert (ZipCommon::isValidPath("some/dir/or/another"));
assert (ZipCommon::isValidPath("some/dir/./another"));
assert (ZipCommon::isValidPath("some/dir/or/another/file.txt"));
assert (ZipCommon::isValidPath("s~me\\d.r\\.or..\\an..her\\file.txt"));
assert (ZipCommon::isValidPath("some\\dir\\or\\another"));
assert (ZipCommon::isValidPath("some\\dir\\or\\another\\file.txt"));
assert (ZipCommon::isValidPath("s~me\\d.r/.or..\\an..her\\file.txt"));
assert (!ZipCommon::isValidPath("/../"));
assert (!ZipCommon::isValidPath("/"));
assert (!ZipCommon::isValidPath("\\..\\"));
assert (!ZipCommon::isValidPath("/..\\"));
assert (!ZipCommon::isValidPath("\\../"));
assert (!ZipCommon::isValidPath(".."));
assert (!ZipCommon::isValidPath("~/"));
assert (!ZipCommon::isValidPath("~/~"));
assert (!ZipCommon::isValidPath("/~"));
assert (!ZipCommon::isValidPath("/file.txt"));
assert (!ZipCommon::isValidPath("~/file.txt"));
assert (!ZipCommon::isValidPath("some/dir/or/../another/file.txt"));
assert (!ZipCommon::isValidPath("C:\\Windows\\system32"));
}
void ZipTest::onDecompressError(const void* pSender, std::pair<const Poco::Zip::ZipLocalFileHeader, const std::string>& info)
{
++_errCnt;
@ -255,9 +320,12 @@ CppUnit::Test* ZipTest::suite()
CppUnit_addTest(pSuite, ZipTest, testDecompressSingleFileInDir);
CppUnit_addTest(pSuite, ZipTest, testDecompress);
CppUnit_addTest(pSuite, ZipTest, testDecompressFlat);
CppUnit_addTest(pSuite, ZipTest, testDecompressVuln);
CppUnit_addTest(pSuite, ZipTest, testDecompressFlatVuln);
CppUnit_addTest(pSuite, ZipTest, testCrcAndSizeAfterData);
CppUnit_addTest(pSuite, ZipTest, testCrcAndSizeAfterDataWithArchive);
CppUnit_addTest(pSuite, ZipTest, testDecompressZip64);
CppUnit_addTest(pSuite, ZipTest, testValidPath);
return pSuite;
}

View File

@ -29,15 +29,17 @@ public:
void testDecompressSingleFile();
void testDecompressSingleFileInDir();
void testDecompress();
void testDecompressFlat();
void testDecompressVuln();
void testDecompressFlatVuln();
void testCrcAndSizeAfterData();
void testCrcAndSizeAfterDataWithArchive();
void testDecompressFlat();
static const Poco::UInt64 KB = 1024;
static const Poco::UInt64 MB = 1024*KB;
void verifyDataFile(const std::string& path, Poco::UInt64 size);
void testDecompressZip64();
void testValidPath();
void setUp();
void tearDown();

View File

@ -1,49 +0,0 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vitae arcu
ac arcu semper mollis. Donec lobortis mi at dui. Integer placerat,
sapien at suscipit faucibus, mi quam sodales sapien, non accumsan enim
justo sit amet sem. Proin fermentum dui vitae metus. Donec a velit et
lectus fermentum bibendum. Donec risus magna, fermentum tempor, tempor
cursus, elementum ac, turpis. Suspendisse ultricies tincidunt quam. Nam
quis risus. Suspendisse in lacus. Vivamus et est ac nisi sollicitudin
ullamcorper. Sed vitae ligula non sem suscipit tempus. Donec tincidunt,
justo nec tristique euismod, sapien velit consequat ante, in vestibulum
dolor justo nec orci. Sed placerat eros. Suspendisse potenti. Vestibulum
eu sem at ante aliquet varius. In quis diam nec libero pretium
vestibulum. Morbi ipsum. Vivamus eros.
Nam pellentesque ante. Donec sit amet nisl. Vestibulum blandit risus sit
amet quam facilisis mollis. Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nulla mattis orci a diam. Duis ultricies massa rhoncus
neque. Morbi hendrerit arcu vel mi. Suspendisse lorem. Pellentesque non
nunc molestie metus pretium tristique. Maecenas ante. Nunc sagittis.
Proin ornare. Donec mi tellus, venenatis nec, ultrices ac, hendrerit in,
quam. Mauris nunc. Vivamus cursus rhoncus felis. Nunc at justo. In hac
habitasse platea dictumst. Nulla metus sapien, cursus nec, luctus eget,
malesuada sed, odio. Sed augue orci, sollicitudin id, auctor eu,
porttitor id, eros. Proin arcu dolor, iaculis quis, ullamcorper sit
amet, ullamcorper nec, ante. Sed dictum luctus est. Phasellus nibh.
Morbi fringilla magna et mi. In eleifend sem non dui luctus suscipit.
Duis dapibus. Proin molestie. Cras vel dui.
In et orci vel erat euismod sodales. Integer porta. Vivamus congue
turpis eu eros tincidunt fermentum. Curabitur consequat ultrices mi.
Praesent sit amet ante. Proin ante. Phasellus vitae nibh. Aliquam ipsum
massa, pretium quis, mattis sed, sagittis sit amet, justo. Integer quam.
Aenean leo erat, commodo quis, elementum sit amet, placerat sed, lacus.
Nam a nunc in sapien scelerisque sodales. Phasellus luctus arcu at
nulla. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Donec facilisis.
Nam scelerisque lacus a eros. Praesent ac arcu et nisl eleifend commodo.
Aenean vestibulum, augue vel posuere mattis, sem massa varius mauris,
non porttitor diam felis eu libero. Suspendisse vulputate, urna quis
dictum scelerisque, risus est pharetra orci, a iaculis dui sem quis
quam. Nam imperdiet quam eget velit. Mauris dui lacus, posuere in,
cursus eget, ultrices ut, eros. Etiam eget purus. Curabitur accumsan
lacinia urna. Donec aliquet dictum erat. Nulla ac magna. Quisque
ultrices vehicula lacus. Fusce eu quam quis est mollis adipiscing.
Pellentesque non libero at eros vulputate iaculis. Praesent vitae orci
ac sapien laoreet scelerisque. Ut ut libero. Vivamus massa urna,
convallis at, laoreet a, adipiscing et, eros. Suspendisse feugiat
malesuada felis. Suspendisse a odio eget tortor tempus pretium.

View File

@ -1,49 +0,0 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vitae arcu
ac arcu semper mollis. Donec lobortis mi at dui. Integer placerat,
sapien at suscipit faucibus, mi quam sodales sapien, non accumsan enim
justo sit amet sem. Proin fermentum dui vitae metus. Donec a velit et
lectus fermentum bibendum. Donec risus magna, fermentum tempor, tempor
cursus, elementum ac, turpis. Suspendisse ultricies tincidunt quam. Nam
quis risus. Suspendisse in lacus. Vivamus et est ac nisi sollicitudin
ullamcorper. Sed vitae ligula non sem suscipit tempus. Donec tincidunt,
justo nec tristique euismod, sapien velit consequat ante, in vestibulum
dolor justo nec orci. Sed placerat eros. Suspendisse potenti. Vestibulum
eu sem at ante aliquet varius. In quis diam nec libero pretium
vestibulum. Morbi ipsum. Vivamus eros.
Nam pellentesque ante. Donec sit amet nisl. Vestibulum blandit risus sit
amet quam facilisis mollis. Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nulla mattis orci a diam. Duis ultricies massa rhoncus
neque. Morbi hendrerit arcu vel mi. Suspendisse lorem. Pellentesque non
nunc molestie metus pretium tristique. Maecenas ante. Nunc sagittis.
Proin ornare. Donec mi tellus, venenatis nec, ultrices ac, hendrerit in,
quam. Mauris nunc. Vivamus cursus rhoncus felis. Nunc at justo. In hac
habitasse platea dictumst. Nulla metus sapien, cursus nec, luctus eget,
malesuada sed, odio. Sed augue orci, sollicitudin id, auctor eu,
porttitor id, eros. Proin arcu dolor, iaculis quis, ullamcorper sit
amet, ullamcorper nec, ante. Sed dictum luctus est. Phasellus nibh.
Morbi fringilla magna et mi. In eleifend sem non dui luctus suscipit.
Duis dapibus. Proin molestie. Cras vel dui.
In et orci vel erat euismod sodales. Integer porta. Vivamus congue
turpis eu eros tincidunt fermentum. Curabitur consequat ultrices mi.
Praesent sit amet ante. Proin ante. Phasellus vitae nibh. Aliquam ipsum
massa, pretium quis, mattis sed, sagittis sit amet, justo. Integer quam.
Aenean leo erat, commodo quis, elementum sit amet, placerat sed, lacus.
Nam a nunc in sapien scelerisque sodales. Phasellus luctus arcu at
nulla. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Donec facilisis.
Nam scelerisque lacus a eros. Praesent ac arcu et nisl eleifend commodo.
Aenean vestibulum, augue vel posuere mattis, sem massa varius mauris,
non porttitor diam felis eu libero. Suspendisse vulputate, urna quis
dictum scelerisque, risus est pharetra orci, a iaculis dui sem quis
quam. Nam imperdiet quam eget velit. Mauris dui lacus, posuere in,
cursus eget, ultrices ut, eros. Etiam eget purus. Curabitur accumsan
lacinia urna. Donec aliquet dictum erat. Nulla ac magna. Quisque
ultrices vehicula lacus. Fusce eu quam quis est mollis adipiscing.
Pellentesque non libero at eros vulputate iaculis. Praesent vitae orci
ac sapien laoreet scelerisque. Ut ut libero. Vivamus massa urna,
convallis at, laoreet a, adipiscing et, eros. Suspendisse feugiat
malesuada felis. Suspendisse a odio eget tortor tempus pretium.

View File

@ -1,49 +0,0 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vitae arcu
ac arcu semper mollis. Donec lobortis mi at dui. Integer placerat,
sapien at suscipit faucibus, mi quam sodales sapien, non accumsan enim
justo sit amet sem. Proin fermentum dui vitae metus. Donec a velit et
lectus fermentum bibendum. Donec risus magna, fermentum tempor, tempor
cursus, elementum ac, turpis. Suspendisse ultricies tincidunt quam. Nam
quis risus. Suspendisse in lacus. Vivamus et est ac nisi sollicitudin
ullamcorper. Sed vitae ligula non sem suscipit tempus. Donec tincidunt,
justo nec tristique euismod, sapien velit consequat ante, in vestibulum
dolor justo nec orci. Sed placerat eros. Suspendisse potenti. Vestibulum
eu sem at ante aliquet varius. In quis diam nec libero pretium
vestibulum. Morbi ipsum. Vivamus eros.
Nam pellentesque ante. Donec sit amet nisl. Vestibulum blandit risus sit
amet quam facilisis mollis. Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nulla mattis orci a diam. Duis ultricies massa rhoncus
neque. Morbi hendrerit arcu vel mi. Suspendisse lorem. Pellentesque non
nunc molestie metus pretium tristique. Maecenas ante. Nunc sagittis.
Proin ornare. Donec mi tellus, venenatis nec, ultrices ac, hendrerit in,
quam. Mauris nunc. Vivamus cursus rhoncus felis. Nunc at justo. In hac
habitasse platea dictumst. Nulla metus sapien, cursus nec, luctus eget,
malesuada sed, odio. Sed augue orci, sollicitudin id, auctor eu,
porttitor id, eros. Proin arcu dolor, iaculis quis, ullamcorper sit
amet, ullamcorper nec, ante. Sed dictum luctus est. Phasellus nibh.
Morbi fringilla magna et mi. In eleifend sem non dui luctus suscipit.
Duis dapibus. Proin molestie. Cras vel dui.
In et orci vel erat euismod sodales. Integer porta. Vivamus congue
turpis eu eros tincidunt fermentum. Curabitur consequat ultrices mi.
Praesent sit amet ante. Proin ante. Phasellus vitae nibh. Aliquam ipsum
massa, pretium quis, mattis sed, sagittis sit amet, justo. Integer quam.
Aenean leo erat, commodo quis, elementum sit amet, placerat sed, lacus.
Nam a nunc in sapien scelerisque sodales. Phasellus luctus arcu at
nulla. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Donec facilisis.
Nam scelerisque lacus a eros. Praesent ac arcu et nisl eleifend commodo.
Aenean vestibulum, augue vel posuere mattis, sem massa varius mauris,
non porttitor diam felis eu libero. Suspendisse vulputate, urna quis
dictum scelerisque, risus est pharetra orci, a iaculis dui sem quis
quam. Nam imperdiet quam eget velit. Mauris dui lacus, posuere in,
cursus eget, ultrices ut, eros. Etiam eget purus. Curabitur accumsan
lacinia urna. Donec aliquet dictum erat. Nulla ac magna. Quisque
ultrices vehicula lacus. Fusce eu quam quis est mollis adipiscing.
Pellentesque non libero at eros vulputate iaculis. Praesent vitae orci
ac sapien laoreet scelerisque. Ut ut libero. Vivamus massa urna,
convallis at, laoreet a, adipiscing et, eros. Suspendisse feugiat
malesuada felis. Suspendisse a odio eget tortor tempus pretium.

View File

@ -1,49 +0,0 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vitae arcu
ac arcu semper mollis. Donec lobortis mi at dui. Integer placerat,
sapien at suscipit faucibus, mi quam sodales sapien, non accumsan enim
justo sit amet sem. Proin fermentum dui vitae metus. Donec a velit et
lectus fermentum bibendum. Donec risus magna, fermentum tempor, tempor
cursus, elementum ac, turpis. Suspendisse ultricies tincidunt quam. Nam
quis risus. Suspendisse in lacus. Vivamus et est ac nisi sollicitudin
ullamcorper. Sed vitae ligula non sem suscipit tempus. Donec tincidunt,
justo nec tristique euismod, sapien velit consequat ante, in vestibulum
dolor justo nec orci. Sed placerat eros. Suspendisse potenti. Vestibulum
eu sem at ante aliquet varius. In quis diam nec libero pretium
vestibulum. Morbi ipsum. Vivamus eros.
Nam pellentesque ante. Donec sit amet nisl. Vestibulum blandit risus sit
amet quam facilisis mollis. Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nulla mattis orci a diam. Duis ultricies massa rhoncus
neque. Morbi hendrerit arcu vel mi. Suspendisse lorem. Pellentesque non
nunc molestie metus pretium tristique. Maecenas ante. Nunc sagittis.
Proin ornare. Donec mi tellus, venenatis nec, ultrices ac, hendrerit in,
quam. Mauris nunc. Vivamus cursus rhoncus felis. Nunc at justo. In hac
habitasse platea dictumst. Nulla metus sapien, cursus nec, luctus eget,
malesuada sed, odio. Sed augue orci, sollicitudin id, auctor eu,
porttitor id, eros. Proin arcu dolor, iaculis quis, ullamcorper sit
amet, ullamcorper nec, ante. Sed dictum luctus est. Phasellus nibh.
Morbi fringilla magna et mi. In eleifend sem non dui luctus suscipit.
Duis dapibus. Proin molestie. Cras vel dui.
In et orci vel erat euismod sodales. Integer porta. Vivamus congue
turpis eu eros tincidunt fermentum. Curabitur consequat ultrices mi.
Praesent sit amet ante. Proin ante. Phasellus vitae nibh. Aliquam ipsum
massa, pretium quis, mattis sed, sagittis sit amet, justo. Integer quam.
Aenean leo erat, commodo quis, elementum sit amet, placerat sed, lacus.
Nam a nunc in sapien scelerisque sodales. Phasellus luctus arcu at
nulla. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Donec facilisis.
Nam scelerisque lacus a eros. Praesent ac arcu et nisl eleifend commodo.
Aenean vestibulum, augue vel posuere mattis, sem massa varius mauris,
non porttitor diam felis eu libero. Suspendisse vulputate, urna quis
dictum scelerisque, risus est pharetra orci, a iaculis dui sem quis
quam. Nam imperdiet quam eget velit. Mauris dui lacus, posuere in,
cursus eget, ultrices ut, eros. Etiam eget purus. Curabitur accumsan
lacinia urna. Donec aliquet dictum erat. Nulla ac magna. Quisque
ultrices vehicula lacus. Fusce eu quam quis est mollis adipiscing.
Pellentesque non libero at eros vulputate iaculis. Praesent vitae orci
ac sapien laoreet scelerisque. Ut ut libero. Vivamus massa urna,
convallis at, laoreet a, adipiscing et, eros. Suspendisse feugiat
malesuada felis. Suspendisse a odio eget tortor tempus pretium.

View File

@ -1,49 +0,0 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vitae arcu
ac arcu semper mollis. Donec lobortis mi at dui. Integer placerat,
sapien at suscipit faucibus, mi quam sodales sapien, non accumsan enim
justo sit amet sem. Proin fermentum dui vitae metus. Donec a velit et
lectus fermentum bibendum. Donec risus magna, fermentum tempor, tempor
cursus, elementum ac, turpis. Suspendisse ultricies tincidunt quam. Nam
quis risus. Suspendisse in lacus. Vivamus et est ac nisi sollicitudin
ullamcorper. Sed vitae ligula non sem suscipit tempus. Donec tincidunt,
justo nec tristique euismod, sapien velit consequat ante, in vestibulum
dolor justo nec orci. Sed placerat eros. Suspendisse potenti. Vestibulum
eu sem at ante aliquet varius. In quis diam nec libero pretium
vestibulum. Morbi ipsum. Vivamus eros.
Nam pellentesque ante. Donec sit amet nisl. Vestibulum blandit risus sit
amet quam facilisis mollis. Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nulla mattis orci a diam. Duis ultricies massa rhoncus
neque. Morbi hendrerit arcu vel mi. Suspendisse lorem. Pellentesque non
nunc molestie metus pretium tristique. Maecenas ante. Nunc sagittis.
Proin ornare. Donec mi tellus, venenatis nec, ultrices ac, hendrerit in,
quam. Mauris nunc. Vivamus cursus rhoncus felis. Nunc at justo. In hac
habitasse platea dictumst. Nulla metus sapien, cursus nec, luctus eget,
malesuada sed, odio. Sed augue orci, sollicitudin id, auctor eu,
porttitor id, eros. Proin arcu dolor, iaculis quis, ullamcorper sit
amet, ullamcorper nec, ante. Sed dictum luctus est. Phasellus nibh.
Morbi fringilla magna et mi. In eleifend sem non dui luctus suscipit.
Duis dapibus. Proin molestie. Cras vel dui.
In et orci vel erat euismod sodales. Integer porta. Vivamus congue
turpis eu eros tincidunt fermentum. Curabitur consequat ultrices mi.
Praesent sit amet ante. Proin ante. Phasellus vitae nibh. Aliquam ipsum
massa, pretium quis, mattis sed, sagittis sit amet, justo. Integer quam.
Aenean leo erat, commodo quis, elementum sit amet, placerat sed, lacus.
Nam a nunc in sapien scelerisque sodales. Phasellus luctus arcu at
nulla. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Donec facilisis.
Nam scelerisque lacus a eros. Praesent ac arcu et nisl eleifend commodo.
Aenean vestibulum, augue vel posuere mattis, sem massa varius mauris,
non porttitor diam felis eu libero. Suspendisse vulputate, urna quis
dictum scelerisque, risus est pharetra orci, a iaculis dui sem quis
quam. Nam imperdiet quam eget velit. Mauris dui lacus, posuere in,
cursus eget, ultrices ut, eros. Etiam eget purus. Curabitur accumsan
lacinia urna. Donec aliquet dictum erat. Nulla ac magna. Quisque
ultrices vehicula lacus. Fusce eu quam quis est mollis adipiscing.
Pellentesque non libero at eros vulputate iaculis. Praesent vitae orci
ac sapien laoreet scelerisque. Ut ut libero. Vivamus massa urna,
convallis at, laoreet a, adipiscing et, eros. Suspendisse feugiat
malesuada felis. Suspendisse a odio eget tortor tempus pretium.

View File

@ -1,49 +0,0 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vitae arcu
ac arcu semper mollis. Donec lobortis mi at dui. Integer placerat,
sapien at suscipit faucibus, mi quam sodales sapien, non accumsan enim
justo sit amet sem. Proin fermentum dui vitae metus. Donec a velit et
lectus fermentum bibendum. Donec risus magna, fermentum tempor, tempor
cursus, elementum ac, turpis. Suspendisse ultricies tincidunt quam. Nam
quis risus. Suspendisse in lacus. Vivamus et est ac nisi sollicitudin
ullamcorper. Sed vitae ligula non sem suscipit tempus. Donec tincidunt,
justo nec tristique euismod, sapien velit consequat ante, in vestibulum
dolor justo nec orci. Sed placerat eros. Suspendisse potenti. Vestibulum
eu sem at ante aliquet varius. In quis diam nec libero pretium
vestibulum. Morbi ipsum. Vivamus eros.
Nam pellentesque ante. Donec sit amet nisl. Vestibulum blandit risus sit
amet quam facilisis mollis. Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nulla mattis orci a diam. Duis ultricies massa rhoncus
neque. Morbi hendrerit arcu vel mi. Suspendisse lorem. Pellentesque non
nunc molestie metus pretium tristique. Maecenas ante. Nunc sagittis.
Proin ornare. Donec mi tellus, venenatis nec, ultrices ac, hendrerit in,
quam. Mauris nunc. Vivamus cursus rhoncus felis. Nunc at justo. In hac
habitasse platea dictumst. Nulla metus sapien, cursus nec, luctus eget,
malesuada sed, odio. Sed augue orci, sollicitudin id, auctor eu,
porttitor id, eros. Proin arcu dolor, iaculis quis, ullamcorper sit
amet, ullamcorper nec, ante. Sed dictum luctus est. Phasellus nibh.
Morbi fringilla magna et mi. In eleifend sem non dui luctus suscipit.
Duis dapibus. Proin molestie. Cras vel dui.
In et orci vel erat euismod sodales. Integer porta. Vivamus congue
turpis eu eros tincidunt fermentum. Curabitur consequat ultrices mi.
Praesent sit amet ante. Proin ante. Phasellus vitae nibh. Aliquam ipsum
massa, pretium quis, mattis sed, sagittis sit amet, justo. Integer quam.
Aenean leo erat, commodo quis, elementum sit amet, placerat sed, lacus.
Nam a nunc in sapien scelerisque sodales. Phasellus luctus arcu at
nulla. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Donec facilisis.
Nam scelerisque lacus a eros. Praesent ac arcu et nisl eleifend commodo.
Aenean vestibulum, augue vel posuere mattis, sem massa varius mauris,
non porttitor diam felis eu libero. Suspendisse vulputate, urna quis
dictum scelerisque, risus est pharetra orci, a iaculis dui sem quis
quam. Nam imperdiet quam eget velit. Mauris dui lacus, posuere in,
cursus eget, ultrices ut, eros. Etiam eget purus. Curabitur accumsan
lacinia urna. Donec aliquet dictum erat. Nulla ac magna. Quisque
ultrices vehicula lacus. Fusce eu quam quis est mollis adipiscing.
Pellentesque non libero at eros vulputate iaculis. Praesent vitae orci
ac sapien laoreet scelerisque. Ut ut libero. Vivamus massa urna,
convallis at, laoreet a, adipiscing et, eros. Suspendisse feugiat
malesuada felis. Suspendisse a odio eget tortor tempus pretium.

View File

@ -1,49 +0,0 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vitae arcu
ac arcu semper mollis. Donec lobortis mi at dui. Integer placerat,
sapien at suscipit faucibus, mi quam sodales sapien, non accumsan enim
justo sit amet sem. Proin fermentum dui vitae metus. Donec a velit et
lectus fermentum bibendum. Donec risus magna, fermentum tempor, tempor
cursus, elementum ac, turpis. Suspendisse ultricies tincidunt quam. Nam
quis risus. Suspendisse in lacus. Vivamus et est ac nisi sollicitudin
ullamcorper. Sed vitae ligula non sem suscipit tempus. Donec tincidunt,
justo nec tristique euismod, sapien velit consequat ante, in vestibulum
dolor justo nec orci. Sed placerat eros. Suspendisse potenti. Vestibulum
eu sem at ante aliquet varius. In quis diam nec libero pretium
vestibulum. Morbi ipsum. Vivamus eros.
Nam pellentesque ante. Donec sit amet nisl. Vestibulum blandit risus sit
amet quam facilisis mollis. Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nulla mattis orci a diam. Duis ultricies massa rhoncus
neque. Morbi hendrerit arcu vel mi. Suspendisse lorem. Pellentesque non
nunc molestie metus pretium tristique. Maecenas ante. Nunc sagittis.
Proin ornare. Donec mi tellus, venenatis nec, ultrices ac, hendrerit in,
quam. Mauris nunc. Vivamus cursus rhoncus felis. Nunc at justo. In hac
habitasse platea dictumst. Nulla metus sapien, cursus nec, luctus eget,
malesuada sed, odio. Sed augue orci, sollicitudin id, auctor eu,
porttitor id, eros. Proin arcu dolor, iaculis quis, ullamcorper sit
amet, ullamcorper nec, ante. Sed dictum luctus est. Phasellus nibh.
Morbi fringilla magna et mi. In eleifend sem non dui luctus suscipit.
Duis dapibus. Proin molestie. Cras vel dui.
In et orci vel erat euismod sodales. Integer porta. Vivamus congue
turpis eu eros tincidunt fermentum. Curabitur consequat ultrices mi.
Praesent sit amet ante. Proin ante. Phasellus vitae nibh. Aliquam ipsum
massa, pretium quis, mattis sed, sagittis sit amet, justo. Integer quam.
Aenean leo erat, commodo quis, elementum sit amet, placerat sed, lacus.
Nam a nunc in sapien scelerisque sodales. Phasellus luctus arcu at
nulla. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Donec facilisis.
Nam scelerisque lacus a eros. Praesent ac arcu et nisl eleifend commodo.
Aenean vestibulum, augue vel posuere mattis, sem massa varius mauris,
non porttitor diam felis eu libero. Suspendisse vulputate, urna quis
dictum scelerisque, risus est pharetra orci, a iaculis dui sem quis
quam. Nam imperdiet quam eget velit. Mauris dui lacus, posuere in,
cursus eget, ultrices ut, eros. Etiam eget purus. Curabitur accumsan
lacinia urna. Donec aliquet dictum erat. Nulla ac magna. Quisque
ultrices vehicula lacus. Fusce eu quam quis est mollis adipiscing.
Pellentesque non libero at eros vulputate iaculis. Praesent vitae orci
ac sapien laoreet scelerisque. Ut ut libero. Vivamus massa urna,
convallis at, laoreet a, adipiscing et, eros. Suspendisse feugiat
malesuada felis. Suspendisse a odio eget tortor tempus pretium.